` instead.
tabIndex: void 0,
onPointerDownCapture(event) {
if (event.isPrimary) {
store.context.pointerDownItemRef.current = event.currentTarget;
}
event.preventDefault();
},
onMouseDown(event) {
event.preventDefault();
},
onClick(event) {
if (disabled3 || readOnly) {
return;
}
commitSelection(event.nativeEvent);
},
onMouseUp(event) {
const pointerStartedOnItem = store.context.pointerDownItemRef.current === event.currentTarget;
store.context.pointerDownItemRef.current = null;
if (disabled3 || readOnly || event.button !== 0 || pointerStartedOnItem || !highlighted) {
return;
}
commitSelection(event.nativeEvent);
}
};
const element = useRenderElement("div", componentProps, {
ref: [buttonRef, forwardedRef, listItem.ref, itemRef],
state,
props: [itemProps, defaultProps, elementProps, getButtonProps]
});
const contextValue = React97.useMemo(() => ({
selected,
textRef
}), [selected, textRef]);
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComboboxItemContext.Provider, {
value: contextValue,
children: element
});
}
function ComboboxItemVirtualizedIndex(props) {
const {
componentProps,
forwardedRef
} = props;
const store = useComboboxRootContext();
const isItemEqualToValue = store.useState("isItemEqualToValue");
const {
flatFilteredValues
} = useComboboxDerivedItemsContext();
const lookupValue = componentProps.value ?? null;
const indexFromFilter = findItemIndex(flatFilteredValues, lookupValue, isItemEqualToValue);
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComboboxItemInner, {
componentProps,
forwardedRef,
virtualized: true,
indexFromFilter
});
}
var ComboboxItem = /* @__PURE__ */ React97.memo(/* @__PURE__ */ React97.forwardRef(function ComboboxItem2(componentProps, forwardedRef) {
const store = useComboboxRootContext();
const virtualized = store.useState("virtualized");
if (virtualized && componentProps.index == null) {
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComboboxItemVirtualizedIndex, {
componentProps,
forwardedRef
});
}
return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ComboboxItemInner, {
componentProps,
forwardedRef,
virtualized,
indexFromFilter: void 0
});
}));
if (true) ComboboxItem.displayName = "ComboboxItem";
// node_modules/@base-ui/react/autocomplete/item/AutocompleteItem.mjs
var AutocompleteItem = ComboboxItem;
// node_modules/@base-ui/react/combobox/row/ComboboxRow.mjs
var React98 = __toESM(require_react(), 1);
var import_jsx_runtime25 = __toESM(require_jsx_runtime(), 1);
var ComboboxRow = /* @__PURE__ */ React98.forwardRef(function ComboboxRow2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const element = useRenderElement("div", componentProps, {
ref: forwardedRef,
props: [{
role: "row"
}, elementProps]
});
return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ComboboxRowContext.Provider, {
value: true,
children: element
});
});
if (true) ComboboxRow.displayName = "ComboboxRow";
// node_modules/@base-ui/react/combobox/empty/ComboboxEmpty.mjs
var React99 = __toESM(require_react(), 1);
var ComboboxEmpty = /* @__PURE__ */ React99.forwardRef(function ComboboxEmpty2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
children: childrenProp,
...elementProps
} = componentProps;
const {
filteredItems
} = useComboboxDerivedItemsContext();
const store = useComboboxRootContext();
const emptyRef = useInitialLiveRegionTextMutation();
const children = filteredItems.length === 0 ? childrenProp : null;
return useRenderElement("div", componentProps, {
ref: [forwardedRef, store.context.emptyRef, emptyRef],
props: [{
children,
role: "status",
"aria-live": "polite",
"aria-atomic": true
}, elementProps]
});
});
if (true) ComboboxEmpty.displayName = "ComboboxEmpty";
// node_modules/@base-ui/react/utils/listbox-separator/ListboxSeparator.mjs
var React100 = __toESM(require_react(), 1);
var ListboxSeparator = /* @__PURE__ */ React100.forwardRef(function ListboxSeparator2(componentProps, forwardedRef) {
const {
className,
render: render4,
orientation = "horizontal",
style,
...elementProps
} = componentProps;
const state = {
orientation
};
return useRenderElement("div", componentProps, {
state,
ref: forwardedRef,
props: [{
role: "presentation"
}, elementProps]
});
});
if (true) ListboxSeparator.displayName = "ListboxSeparator";
// node_modules/@base-ui/react/autocomplete/separator/AutocompleteSeparator.mjs
var AutocompleteSeparator = ListboxSeparator;
// node_modules/@base-ui/react/combobox/root/utils/useFilteredItems.mjs
function useFilteredItems() {
const items = useComboboxDerivedItemsContext();
return items.filteredItems;
}
// node_modules/@base-ui/react/button/Button.mjs
var React101 = __toESM(require_react(), 1);
var Button = /* @__PURE__ */ React101.forwardRef(function Button2(componentProps, forwardedRef) {
const {
render: render4,
className,
disabled: disabled3 = false,
focusableWhenDisabled = false,
nativeButton = true,
style,
...elementProps
} = componentProps;
const {
getButtonProps,
buttonRef
} = useButton({
disabled: disabled3,
focusableWhenDisabled,
native: nativeButton
});
const state = {
disabled: disabled3
};
return useRenderElement("button", componentProps, {
state,
ref: [forwardedRef, buttonRef],
props: [elementProps, getButtonProps]
});
});
if (true) Button.displayName = "Button";
// node_modules/@base-ui/react/field/item/FieldItemContext.mjs
var React102 = __toESM(require_react(), 1);
var FieldItemContext = /* @__PURE__ */ React102.createContext({
disabled: false
});
if (true) FieldItemContext.displayName = "FieldItemContext";
function useFieldItemContext() {
const context = React102.useContext(FieldItemContext);
return context;
}
// node_modules/@base-ui/react/field/root/useFieldValidation.mjs
var React103 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/field/utils/getCombinedFieldValidityData.mjs
function getCombinedFieldValidityData(validityData, invalid2) {
return {
...validityData,
state: {
...validityData.state,
valid: !invalid2 && validityData.state.valid
}
};
}
// node_modules/@base-ui/react/field/root/useFieldValidation.mjs
var validityKeys = Object.keys(DEFAULT_VALIDITY_STATE);
function isEligibleInput(input, formElement) {
if (input.matches(":disabled")) {
return false;
}
if (!formElement || input.form === formElement) {
return true;
}
return input.form === null && !input.hasAttribute("form");
}
function findRepresentativeInput(inputs, formElement) {
let fallback = null;
for (const input of inputs.keys()) {
if (!isEligibleInput(input, formElement)) {
continue;
}
if (!input.validity.valid) {
return input;
}
fallback ??= input;
}
return fallback;
}
function makeState(customError) {
return {
...DEFAULT_VALIDITY_STATE,
valid: !customError,
customError
};
}
function getNativeErrors(element) {
return element && element.validationMessage ? [element.validationMessage] : [];
}
function useFieldValidation(params) {
const {
elementRef,
formRef
} = useFormContext();
const {
setValidityData,
validate,
validityData,
validationDebounceTime,
invalid: invalid2,
markedDirtyRef,
state,
shouldValidateOnChange,
validationMode,
registeredFieldIdRef
} = params;
const {
controlId,
getDescriptionProps
} = useLabelableContext();
const timeout = useTimeout();
const inputRef = React103.useRef(null);
const registeredInputs = useRefWithInit(() => /* @__PURE__ */ new Map()).current;
const validationCommitIdRef = React103.useRef(0);
const customValidityRef = React103.useRef(null);
const registerInput = React103.useCallback((element, registration) => {
registeredInputs.set(element, registration);
return () => {
registeredInputs.delete(element);
};
}, [registeredInputs]);
const getInputControl = useStableCallback(() => {
const element = findRepresentativeInput(registeredInputs, elementRef.current);
return element && registeredInputs.get(element)?.controlRef.current || null;
});
const commit = useStableCallback(async (value, revalidate = false) => {
validationCommitIdRef.current += 1;
const validationCommitId = validationCommitIdRef.current;
function updateRegisteredFieldValidity(nextValidityData, externalInvalid = invalid2) {
const fieldId = registeredFieldIdRef.current ?? controlId;
if (fieldId == null) {
return;
}
const currentFieldData = formRef.current.fields.get(fieldId);
if (!currentFieldData) {
return;
}
const validityDataWithFormErrors = getCombinedFieldValidityData(nextValidityData, externalInvalid);
formRef.current.fields.set(fieldId, {
...currentFieldData,
validityData: validityDataWithFormErrors
});
}
function makeValidityData(validityState, errorMessages) {
const errors = validityState.valid === false ? errorMessages : [];
return {
value,
state: validityState,
error: errors[0] ?? "",
errors,
initialValue: validityData.initialValue
};
}
function setCustomValidity(element2, message2) {
const displaced = element2.validity.customError ? element2.validationMessage : "";
const ownedMessage = message2.replace(/\r\n?/g, "\n");
element2.setCustomValidity(ownedMessage);
customValidityRef.current = [element2, ownedMessage, displaced];
}
function clearCustomValidity() {
const record = customValidityRef.current;
customValidityRef.current = null;
if (record && (!record[0].willValidate || record[0].validationMessage === record[1])) {
record[0].setCustomValidity(record[2]);
}
}
function publish(validityState, errorMessages, externalInvalid) {
const nextValidityData = makeValidityData(validityState, errorMessages);
updateRegisteredFieldValidity(nextValidityData, externalInvalid);
setValidityData(nextValidityData);
}
function getState(el) {
const computedState = validityKeys.reduce((acc, key2) => {
acc[key2] = el.validity[key2];
return acc;
}, {});
let hasOnlyValueMissingError = false;
for (const key2 of validityKeys) {
if (key2 === "valid") {
continue;
}
if (key2 === "valueMissing" && computedState[key2]) {
hasOnlyValueMissingError = true;
} else if (computedState[key2]) {
return computedState;
}
}
if (hasOnlyValueMissingError && !markedDirtyRef.current) {
computedState.valid = true;
computedState.valueMissing = false;
}
return computedState;
}
function resolveRepresentativeInput() {
return registeredInputs.size > 0 ? findRepresentativeInput(registeredInputs, elementRef.current) : inputRef.current;
}
let element = resolveRepresentativeInput();
function refreshState() {
element = resolveRepresentativeInput();
return element?.willValidate ? getState(element) : makeState(false);
}
if (revalidate) {
if (state.valid !== false || !element) {
return;
}
if (!element.validity.valueMissing) {
clearCustomValidity();
const currentElement = resolveRepresentativeInput();
const foreign = currentElement?.validity.customError ? getNativeErrors(currentElement) : [];
publish(makeState(foreign.length > 0), foreign, false);
return;
}
for (const key2 of validityKeys) {
if (key2 !== "valid" && key2 !== "valueMissing" && key2 !== "customError" && element.validity[key2]) {
return;
}
}
}
timeout.clear();
clearCustomValidity();
let nextState = refreshState();
let validationErrors = getNativeErrors(element);
const isValidatingOnChange = shouldValidateOnChange();
if (validationErrors.length === 0 || isValidatingOnChange) {
const formValues = Array.from(formRef.current.fields.values()).reduce((acc, field) => {
if (field.name) {
acc[field.name] = field.getValue();
}
return acc;
}, {});
const resultOrPromise = validate(value, formValues);
let result;
if (typeof resultOrPromise === "object" && resultOrPromise !== null && "then" in resultOrPromise) {
if (nextState.valid === false) {
publish(nextState, validationErrors);
} else if (validationMode === "onSubmit" || !validityData.state.customError) {
nextState.valid = null;
publish(nextState, validationErrors);
}
result = await resultOrPromise;
if (validationCommitId !== validationCommitIdRef.current) {
return;
}
nextState = refreshState();
} else {
result = resultOrPromise;
}
validationErrors = result ? [].concat(result).filter(Boolean) : [];
if (validationErrors.length > 0) {
nextState.valid = false;
nextState.customError = true;
if (element?.willValidate) {
setCustomValidity(element, validationErrors.join("\n"));
}
} else {
validationErrors = getNativeErrors(element);
}
}
publish(nextState, validationErrors);
});
const change = useStableCallback((value, cancelPending = false) => {
timeout.clear();
validationCommitIdRef.current += 1;
if (cancelPending) {
return;
}
const validateOnChange = shouldValidateOnChange();
if (validateOnChange && value !== "" && validationDebounceTime) {
timeout.start(validationDebounceTime, () => {
commit(value);
});
} else {
commit(value, !validateOnChange);
}
});
const getValidationProps = React103.useCallback((disabled3, externalProps = {}) => mergeProps(getDescriptionProps(externalProps), state.valid === false && !state.disabled && !disabled3 ? {
"aria-invalid": true
} : EMPTY_OBJECT), [getDescriptionProps, state.disabled, state.valid]);
return React103.useMemo(() => ({
getValidationProps,
inputRef,
registeredInputs,
registerInput,
getInputControl,
commit,
change
}), [getValidationProps, registeredInputs, registerInput, getInputControl, commit, change]);
}
// node_modules/@base-ui/react/collapsible/index.parts.mjs
var index_parts_exports3 = {};
__export(index_parts_exports3, {
Panel: () => CollapsiblePanel,
Root: () => CollapsibleRoot,
Trigger: () => CollapsibleTrigger
});
// node_modules/@base-ui/react/collapsible/root/CollapsibleRoot.mjs
var React104 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/collapsible/root/stateAttributesMapping.mjs
var collapsibleStateAttributesMapping = {
...collapsibleOpenStateMapping,
...transitionStatusMapping
};
// node_modules/@base-ui/react/collapsible/root/CollapsibleRoot.mjs
var import_jsx_runtime26 = __toESM(require_jsx_runtime(), 1);
var CollapsibleRoot = /* @__PURE__ */ React104.forwardRef(function CollapsibleRoot2(componentProps, forwardedRef) {
const {
render: render4,
className,
defaultOpen = false,
disabled: disabled3 = false,
onOpenChange: onOpenChangeProp,
open: open7,
style,
...elementProps
} = componentProps;
const onOpenChange = useStableCallback(onOpenChangeProp);
const collapsible = useCollapsibleRoot({
open: open7,
defaultOpen,
onOpenChange,
disabled: disabled3
});
const state = React104.useMemo(() => ({
open: collapsible.open,
disabled: collapsible.disabled,
transitionStatus: collapsible.transitionStatus
}), [collapsible.open, collapsible.disabled, collapsible.transitionStatus]);
const contextValue = React104.useMemo(() => ({
...collapsible,
onOpenChange,
state
}), [collapsible, onOpenChange, state]);
const element = useRenderElement("div", componentProps, {
state,
ref: forwardedRef,
props: elementProps,
stateAttributesMapping: collapsibleStateAttributesMapping
});
return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CollapsibleRootContext.Provider, {
value: contextValue,
children: element
});
});
if (true) CollapsibleRoot.displayName = "CollapsibleRoot";
// node_modules/@base-ui/react/collapsible/trigger/CollapsibleTrigger.mjs
var React105 = __toESM(require_react(), 1);
var stateAttributesMapping4 = {
...triggerOpenStateMapping,
...transitionStatusMapping
};
var CollapsibleTrigger = /* @__PURE__ */ React105.forwardRef(function CollapsibleTrigger2(componentProps, forwardedRef) {
const {
panelId,
open: open7,
handleTrigger,
state,
disabled: contextDisabled
} = useCollapsibleRootContext();
const {
className,
disabled: disabled3 = contextDisabled,
render: render4,
nativeButton = true,
style,
...elementProps
} = componentProps;
const {
getButtonProps,
buttonRef
} = useButton({
disabled: disabled3,
focusableWhenDisabled: true,
native: nativeButton
});
const element = useRenderElement("button", componentProps, {
state,
ref: [forwardedRef, buttonRef],
props: [{
"aria-controls": open7 ? panelId : void 0,
"aria-expanded": open7,
onClick: handleTrigger
}, elementProps, getButtonProps],
stateAttributesMapping: stateAttributesMapping4
});
return element;
});
if (true) CollapsibleTrigger.displayName = "CollapsibleTrigger";
// node_modules/@base-ui/react/collapsible/panel/CollapsiblePanel.mjs
var React106 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/collapsible/panel/CollapsiblePanelCssVars.mjs
var collapsiblePanelHeight = "--collapsible-panel-height";
var collapsiblePanelWidth = "--collapsible-panel-width";
// node_modules/@base-ui/react/collapsible/panel/CollapsiblePanel.mjs
var CollapsiblePanel = /* @__PURE__ */ React106.forwardRef(function CollapsiblePanel2(componentProps, forwardedRef) {
const {
className,
hiddenUntilFound: hiddenUntilFoundProp,
keepMounted: keepMountedProp,
render: render4,
id: idProp,
style,
...elementProps
} = componentProps;
if (true) {
React106.useEffect(() => {
if (hiddenUntilFoundProp && keepMountedProp === false) {
warn("The `keepMounted={false}` prop on `Collapsible.Panel` is ignored when `hiddenUntilFound` is enabled, since the panel must remain mounted while closed.");
}
}, [hiddenUntilFoundProp, keepMountedProp]);
}
const {
defaultPanelId,
mounted,
onOpenChange,
open: open7,
setMounted,
setPanelIdState,
setOpen,
state,
transitionStatus
} = useCollapsibleRootContext();
const hiddenUntilFound = hiddenUntilFoundProp ?? false;
const keepMounted = keepMountedProp ?? false;
const registeredId = idProp || void 0;
const id = registeredId ?? defaultPanelId;
useIsoLayoutEffect(() => {
setPanelIdState((currentId) => registeredId ?? (currentId === null ? void 0 : currentId));
return () => {
setPanelIdState((currentId) => currentId === registeredId ? null : currentId);
};
}, [registeredId, setPanelIdState]);
const {
height: height2,
props,
ref,
shouldPreventOpenAnimation,
shouldRender,
transitionStatus: panelTransitionStatus,
width
} = useCollapsiblePanel({
externalRef: forwardedRef,
hiddenUntilFound,
id,
keepMounted,
mounted,
onOpenChange,
open: open7,
setMounted,
setOpen,
transitionStatus
});
const panelState = {
...state,
transitionStatus: panelTransitionStatus
};
const resolvedStyle = resolveStyle(style, panelState);
const element = useRenderElement("div", {
...componentProps,
style: void 0
}, {
state: panelState,
ref,
props: [
props,
{
style: {
[collapsiblePanelHeight]: height2 === void 0 ? "auto" : `${height2}px`,
[collapsiblePanelWidth]: width === void 0 ? "auto" : `${width}px`
}
},
elementProps,
resolvedStyle ? {
style: resolvedStyle
} : void 0,
// Resolve the public `style` prop so temporary `animationName: 'none'`
// can still win after user's inline styles have been merged.
shouldPreventOpenAnimation ? {
style: {
animationName: "none"
}
} : void 0
],
stateAttributesMapping: collapsibleStateAttributesMapping
});
if (!shouldRender) {
return null;
}
return element;
});
if (true) CollapsiblePanel.displayName = "CollapsiblePanel";
// node_modules/@base-ui/react/utils/useRegisteredLabelId.mjs
function useRegisteredLabelId(idProp, setLabelId) {
const id = useBaseUiId(idProp);
useIsoLayoutEffect(() => {
setLabelId(id);
return () => {
setLabelId((currentId) => currentId === id ? void 0 : currentId);
};
}, [id, setLabelId]);
return id;
}
// node_modules/@base-ui/react/internals/labelable-provider/useLabel.mjs
function useLabel(params = {}) {
const {
id: idProp,
fallbackControlId,
native = false,
setLabelId: setLabelIdProp,
focusControl: focusControlProp
} = params;
const {
controlId: contextControlId,
setLabelId: setContextLabelId
} = useLabelableContext();
const syncLabelId = useStableCallback((nextLabelId) => {
setContextLabelId(nextLabelId);
setLabelIdProp?.(nextLabelId);
});
const id = useRegisteredLabelId(idProp, syncLabelId);
const resolvedControlId = contextControlId ?? fallbackControlId;
function focusControl(event) {
if (focusControlProp) {
focusControlProp(event, resolvedControlId);
return;
}
if (!resolvedControlId) {
return;
}
const controlElement = ownerDocument(event.currentTarget).getElementById(resolvedControlId);
if (isHTMLElement(controlElement)) {
focusElementWithVisible(controlElement);
}
}
function handleInteraction(event) {
const target = getTarget(event.nativeEvent);
if (target?.closest("button,input,select,textarea")) {
return;
}
if (!event.defaultPrevented && event.detail > 1) {
event.preventDefault();
}
if (native) {
return;
}
focusControl(event);
}
return native ? {
id,
htmlFor: resolvedControlId,
onMouseDown: handleInteraction
} : {
id,
onClick: handleInteraction,
onPointerDown(event) {
event.preventDefault();
}
};
}
function focusElementWithVisible(element) {
element.focus({
// Available from Chrome 144+ (January 2026).
// Safari and Firefox already support it.
focusVisible: true
});
}
// node_modules/@base-ui/react/context-menu/root/ContextMenuRootContext.mjs
var React107 = __toESM(require_react(), 1);
var ContextMenuRootContext = /* @__PURE__ */ React107.createContext(void 0);
if (true) ContextMenuRootContext.displayName = "ContextMenuRootContext";
function useContextMenuRootContext(optional = true) {
const context = React107.useContext(ContextMenuRootContext);
if (context === void 0 && !optional) {
throw new Error(true ? "Base UI: ContextMenuRootContext is missing. ContextMenu parts must be placed within
." : formatErrorMessage_default(25));
}
return context;
}
// node_modules/@base-ui/react/menu/index.parts.mjs
var index_parts_exports4 = {};
__export(index_parts_exports4, {
Arrow: () => MenuArrow,
Backdrop: () => MenuBackdrop,
CheckboxItem: () => MenuCheckboxItem,
CheckboxItemIndicator: () => MenuCheckboxItemIndicator,
Group: () => MenuGroup,
GroupLabel: () => MenuGroupLabel,
Handle: () => MenuHandle,
Item: () => MenuItem,
LinkItem: () => MenuLinkItem,
Popup: () => MenuPopup,
Portal: () => MenuPortal,
Positioner: () => MenuPositioner,
RadioGroup: () => MenuRadioGroup,
RadioItem: () => MenuRadioItem,
RadioItemIndicator: () => MenuRadioItemIndicator,
Root: () => MenuRoot,
Separator: () => Separator,
SubmenuRoot: () => MenuSubmenuRoot,
SubmenuTrigger: () => MenuSubmenuTrigger,
Trigger: () => MenuTrigger,
Viewport: () => MenuViewport,
createHandle: () => createMenuHandle
});
// node_modules/@base-ui/react/menu/arrow/MenuArrow.mjs
var React110 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/positioner/MenuPositionerContext.mjs
var React108 = __toESM(require_react(), 1);
var MenuPositionerContext = /* @__PURE__ */ React108.createContext(void 0);
if (true) MenuPositionerContext.displayName = "MenuPositionerContext";
function useMenuPositionerContext(optional) {
const context = React108.useContext(MenuPositionerContext);
if (context === void 0 && !optional) {
throw new Error(true ? "Base UI: MenuPositionerContext is missing. MenuPositioner parts must be placed within ." : formatErrorMessage_default(33));
}
return context;
}
// node_modules/@base-ui/react/menu/root/MenuRootContext.mjs
var React109 = __toESM(require_react(), 1);
var MenuRootContext = /* @__PURE__ */ React109.createContext(void 0);
if (true) MenuRootContext.displayName = "MenuRootContext";
function useMenuRootContext(optional) {
const context = React109.useContext(MenuRootContext);
if (context === void 0 && !optional) {
throw new Error(true ? "Base UI: MenuRootContext is missing. Menu parts must be placed within ." : formatErrorMessage_default(36));
}
return context;
}
// node_modules/@base-ui/react/menu/arrow/MenuArrow.mjs
var MenuArrow = /* @__PURE__ */ React110.forwardRef(function MenuArrow2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const {
store
} = useMenuRootContext();
const {
arrowRef,
side: side2,
align: align2,
arrowUncentered,
arrowStyles
} = useMenuPositionerContext();
const open7 = store.useState("open");
const state = {
open: open7,
side: side2,
align: align2,
uncentered: arrowUncentered
};
return useRenderElement("div", componentProps, {
ref: [arrowRef, forwardedRef],
stateAttributesMapping: popupStateMapping,
state,
props: {
style: arrowStyles,
"aria-hidden": true,
...elementProps
}
});
});
if (true) MenuArrow.displayName = "MenuArrow";
// node_modules/@base-ui/react/menu/backdrop/MenuBackdrop.mjs
var React111 = __toESM(require_react(), 1);
var MenuBackdrop = /* @__PURE__ */ React111.forwardRef(function MenuBackdrop2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const {
store
} = useMenuRootContext();
const open7 = store.useState("open");
const mounted = store.useState("mounted");
const transitionStatus = store.useState("transitionStatus");
const lastOpenChangeReason = store.useState("lastOpenChangeReason");
const contextMenuContext = useContextMenuRootContext();
const state = {
open: open7,
transitionStatus
};
return useRenderElement("div", componentProps, {
ref: contextMenuContext?.backdropRef ? [forwardedRef, contextMenuContext.backdropRef] : forwardedRef,
state,
stateAttributesMapping: popupTransitionStateMapping,
props: [{
role: "presentation",
hidden: !mounted,
style: {
pointerEvents: lastOpenChangeReason === reason_parts_exports.triggerHover ? "none" : void 0,
userSelect: "none",
WebkitUserSelect: "none"
}
}, elementProps]
});
});
if (true) MenuBackdrop.displayName = "MenuBackdrop";
// node_modules/@base-ui/react/menu/checkbox-item/MenuCheckboxItem.mjs
var React115 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/checkbox-item/MenuCheckboxItemContext.mjs
var React112 = __toESM(require_react(), 1);
var MenuCheckboxItemContext = /* @__PURE__ */ React112.createContext(void 0);
if (true) MenuCheckboxItemContext.displayName = "MenuCheckboxItemContext";
function useMenuCheckboxItemContext() {
const context = React112.useContext(MenuCheckboxItemContext);
if (context === void 0) {
throw new Error(true ? "Base UI: MenuCheckboxItemContext is missing. MenuCheckboxItem parts must be placed within ." : formatErrorMessage_default(30));
}
return context;
}
// node_modules/@base-ui/react/menu/item/useMenuItem.mjs
var React114 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/item/useMenuItemCommonProps.mjs
var React113 = __toESM(require_react(), 1);
function useMenuItemCommonProps(params) {
const {
closeOnClick,
highlighted,
id,
nodeId,
store,
typingRef,
itemRef,
itemMetadata
} = params;
const {
events: menuEvents
} = store.useState("floatingTreeRoot");
const open7 = store.useState("open");
const contextMenuContext = useContextMenuRootContext(true);
const isContextMenu = contextMenuContext !== void 0;
return React113.useMemo(() => ({
id,
role: "menuitem",
tabIndex: open7 && highlighted ? 0 : -1,
onKeyDown(event) {
if (event.key === " " && typingRef?.current) {
event.preventDefault();
}
},
onMouseMove(event) {
if (!nodeId) {
return;
}
menuEvents.emit("itemhover", {
nodeId,
target: event.currentTarget
});
},
onClick(event) {
if (closeOnClick) {
menuEvents.emit("close", {
domEvent: event,
reason: reason_parts_exports.itemPress
});
}
},
onMouseUp(event) {
if (contextMenuContext) {
const initialCursorPoint = contextMenuContext.initialCursorPointRef.current;
contextMenuContext.initialCursorPointRef.current = null;
if (isContextMenu && initialCursorPoint && Math.abs(event.clientX - initialCursorPoint.x) <= 1 && Math.abs(event.clientY - initialCursorPoint.y) <= 1) {
return;
}
if (isContextMenu && !parts_exports.os.mac && event.button === 2) {
return;
}
}
if (itemRef.current && store.context.allowMouseUpTriggerRef.current && (!isContextMenu || event.button === 2)) {
if (itemMetadata.type === "regular-item") {
dispatchClickWithModifiers(itemRef.current, event, {
detail: 1
});
}
}
}
}), [closeOnClick, highlighted, id, menuEvents, nodeId, open7, store, typingRef, itemRef, contextMenuContext, isContextMenu, itemMetadata]);
}
// node_modules/@base-ui/react/menu/item/useMenuItem.mjs
var REGULAR_ITEM = {
type: "regular-item"
};
function useMenuItem(params) {
const {
closeOnClick,
disabled: disabled3,
highlighted,
id,
store,
typingRef = store.context.typingRef,
nativeButton,
itemMetadata,
nodeId
} = params;
const itemRef = React114.useRef(null);
const {
getButtonProps,
buttonRef
} = useButton({
disabled: disabled3,
focusableWhenDisabled: true,
native: nativeButton,
composite: true
});
const commonProps = useMenuItemCommonProps({
closeOnClick,
highlighted,
id,
nodeId,
store,
typingRef,
itemRef,
itemMetadata
});
const getItemProps = React114.useCallback((externalProps) => {
return mergeProps(commonProps, {
onMouseEnter() {
if (itemMetadata.type !== "submenu-trigger") {
return;
}
itemMetadata.setActive();
}
}, externalProps, getButtonProps);
}, [commonProps, getButtonProps, itemMetadata]);
const mergedRef = useMergedRefs(itemRef, buttonRef);
return React114.useMemo(() => ({
getItemProps,
itemRef: mergedRef
}), [getItemProps, mergedRef]);
}
// node_modules/@base-ui/react/menu/checkbox-item/MenuCheckboxItemDataAttributes.mjs
var checked = "data-checked";
var unchecked = "data-unchecked";
// node_modules/@base-ui/react/menu/utils/stateAttributesMapping.mjs
var itemMapping = {
checked(value) {
if (value) {
return {
[checked]: ""
};
}
return {
[unchecked]: ""
};
},
...transitionStatusMapping
};
// node_modules/@base-ui/react/menu/checkbox-item/MenuCheckboxItem.mjs
var import_jsx_runtime27 = __toESM(require_jsx_runtime(), 1);
var MenuCheckboxItem = /* @__PURE__ */ React115.forwardRef(function MenuCheckboxItem2(componentProps, forwardedRef) {
const {
render: render4,
className,
id: idProp,
label,
nativeButton = false,
disabled: disabledProp = false,
closeOnClick = false,
checked: checkedProp,
defaultChecked,
onCheckedChange,
style,
...elementProps
} = componentProps;
const listItem = useCompositeListItem({
guess: true,
label
});
const menuPositionerContext = useMenuPositionerContext(true);
const id = useBaseUiId(idProp);
const {
store
} = useMenuRootContext();
const rootDisabled = store.useState("disabled");
const disabled3 = disabledProp || rootDisabled;
const highlighted = store.useState("isActive", listItem.index);
const itemProps = store.useState("itemProps");
const [checked2, setChecked] = useControlled({
controlled: checkedProp,
default: defaultChecked ?? false,
name: "MenuCheckboxItem",
state: "checked"
});
const {
getItemProps,
itemRef
} = useMenuItem({
closeOnClick,
disabled: disabled3,
highlighted,
id,
store,
nativeButton,
nodeId: menuPositionerContext?.context.nodeId,
itemMetadata: REGULAR_ITEM
});
const state = React115.useMemo(() => ({
disabled: disabled3,
highlighted,
checked: checked2
}), [disabled3, highlighted, checked2]);
function handleClick(event) {
const details = createChangeEventDetails(reason_parts_exports.itemPress, event.nativeEvent, void 0, {
preventUnmountOnClose: NOOP
});
onCheckedChange?.(!checked2, details);
if (details.isCanceled) {
return;
}
setChecked((currentlyChecked) => !currentlyChecked);
}
const element = useRenderElement("div", componentProps, {
state,
stateAttributesMapping: itemMapping,
props: [itemProps, {
role: "menuitemcheckbox",
"aria-checked": checked2,
onClick: handleClick
}, elementProps, getItemProps],
ref: [itemRef, forwardedRef, listItem.ref]
});
return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(MenuCheckboxItemContext.Provider, {
value: state,
children: element
});
});
if (true) MenuCheckboxItem.displayName = "MenuCheckboxItem";
// node_modules/@base-ui/react/menu/checkbox-item-indicator/MenuCheckboxItemIndicator.mjs
var React116 = __toESM(require_react(), 1);
var MenuCheckboxItemIndicator = /* @__PURE__ */ React116.forwardRef(function MenuCheckboxItemIndicator2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
keepMounted = false,
...elementProps
} = componentProps;
const item = useMenuCheckboxItemContext();
const indicatorRef = React116.useRef(null);
const {
transitionStatus,
mounted,
setMounted
} = useTransitionStatus(item.checked);
useOpenChangeComplete({
batch: true,
enabled: !item.checked,
open: item.checked,
ref: indicatorRef,
onComplete() {
if (!item.checked) {
setMounted(false);
}
}
});
const state = {
checked: item.checked,
disabled: item.disabled,
highlighted: item.highlighted,
transitionStatus
};
const element = useRenderElement("span", componentProps, {
state,
ref: [forwardedRef, indicatorRef],
stateAttributesMapping: itemMapping,
props: {
"aria-hidden": true,
...elementProps
},
enabled: keepMounted || mounted
});
return element;
});
if (true) MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator";
// node_modules/@base-ui/react/menu/group/MenuGroup.mjs
var React118 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/group/MenuGroupContext.mjs
var React117 = __toESM(require_react(), 1);
var MenuGroupContext = /* @__PURE__ */ React117.createContext(void 0);
if (true) MenuGroupContext.displayName = "MenuGroupContext";
function useMenuGroupRootContext() {
const context = React117.useContext(MenuGroupContext);
if (context === void 0) {
throw new Error(true ? "Base UI: MenuGroupContext is missing. Menu group parts must be used within or ." : formatErrorMessage_default(31));
}
return context;
}
// node_modules/@base-ui/react/menu/group/MenuGroup.mjs
var import_jsx_runtime28 = __toESM(require_jsx_runtime(), 1);
var MenuGroup = /* @__PURE__ */ React118.forwardRef(function MenuGroup2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const [labelId, setLabelId] = React118.useState(void 0);
const element = useRenderElement("div", componentProps, {
ref: forwardedRef,
props: {
role: "group",
"aria-labelledby": labelId,
...elementProps
}
});
return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(MenuGroupContext.Provider, {
value: setLabelId,
children: element
});
});
if (true) MenuGroup.displayName = "MenuGroup";
// node_modules/@base-ui/react/menu/group-label/MenuGroupLabel.mjs
var React119 = __toESM(require_react(), 1);
var MenuGroupLabel = /* @__PURE__ */ React119.forwardRef(function MenuGroupLabel2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
id: idProp,
...elementProps
} = componentProps;
const id = useBaseUiId(idProp);
const setLabelId = useMenuGroupRootContext();
useIsoLayoutEffect(() => {
setLabelId(id);
return () => {
setLabelId((currentId) => currentId === id ? void 0 : currentId);
};
}, [setLabelId, id]);
return useRenderElement("div", componentProps, {
ref: forwardedRef,
props: {
id,
"aria-hidden": true,
...elementProps
}
});
});
if (true) MenuGroupLabel.displayName = "MenuGroupLabel";
// node_modules/@base-ui/react/menu/item/MenuItem.mjs
var React120 = __toESM(require_react(), 1);
var MenuItem = /* @__PURE__ */ React120.forwardRef(function MenuItem2(componentProps, forwardedRef) {
const {
render: render4,
className,
id: idProp,
label,
nativeButton = false,
disabled: disabledProp = false,
closeOnClick = true,
style,
...elementProps
} = componentProps;
const listItem = useCompositeListItem({
guess: true,
label
});
const menuPositionerContext = useMenuPositionerContext(true);
const id = useBaseUiId(idProp);
const {
store
} = useMenuRootContext();
const rootDisabled = store.useState("disabled");
const disabled3 = disabledProp || rootDisabled;
const highlighted = store.useState("isActive", listItem.index);
const itemProps = store.useState("itemProps");
const {
getItemProps,
itemRef
} = useMenuItem({
closeOnClick,
disabled: disabled3,
highlighted,
id,
store,
nativeButton,
nodeId: menuPositionerContext?.context.nodeId,
itemMetadata: REGULAR_ITEM
});
const state = {
disabled: disabled3,
highlighted
};
return useRenderElement("div", componentProps, {
state,
props: [itemProps, elementProps, getItemProps],
ref: [itemRef, forwardedRef, listItem.ref]
});
});
if (true) MenuItem.displayName = "MenuItem";
// node_modules/@base-ui/react/menu/link-item/MenuLinkItem.mjs
var React121 = __toESM(require_react(), 1);
var MenuLinkItem = /* @__PURE__ */ React121.forwardRef(function MenuLinkItem2(componentProps, forwardedRef) {
const {
render: render4,
className,
id: idProp,
label,
closeOnClick = false,
style,
...elementProps
} = componentProps;
const linkRef = React121.useRef(null);
const listItem = useCompositeListItem({
guess: true,
label
});
const menuPositionerContext = useMenuPositionerContext(true);
const nodeId = menuPositionerContext?.context.nodeId;
const id = useBaseUiId(idProp);
const {
store
} = useMenuRootContext();
const highlighted = store.useState("isActive", listItem.index);
const itemProps = store.useState("itemProps");
const typingRef = store.context.typingRef;
const {
getButtonProps,
buttonRef
} = useButton({
native: false,
composite: true
});
const commonProps = useMenuItemCommonProps({
closeOnClick,
highlighted,
id,
nodeId,
store,
typingRef,
itemRef: linkRef,
itemMetadata: REGULAR_ITEM
});
function getItemProps(externalProps) {
return mergeProps(commonProps, externalProps, getButtonProps);
}
const state = {
highlighted
};
return useRenderElement("a", componentProps, {
state,
props: [itemProps, elementProps, getItemProps],
ref: [linkRef, buttonRef, forwardedRef, listItem.ref]
});
});
if (true) MenuLinkItem.displayName = "MenuLinkItem";
// node_modules/@base-ui/react/menu/popup/MenuPopup.mjs
var React123 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/toolbar/root/ToolbarRootContext.mjs
var React122 = __toESM(require_react(), 1);
var ToolbarRootContext = /* @__PURE__ */ React122.createContext(void 0);
if (true) ToolbarRootContext.displayName = "ToolbarRootContext";
function useToolbarRootContext(optional) {
const context = React122.useContext(ToolbarRootContext);
if (context === void 0 && !optional) {
throw new Error(true ? "Base UI: ToolbarRootContext is missing. Toolbar parts must be placed within ." : formatErrorMessage_default(69));
}
return context;
}
// node_modules/@base-ui/react/menu/popup/MenuPopup.mjs
var import_jsx_runtime29 = __toESM(require_jsx_runtime(), 1);
var MenuPopup = /* @__PURE__ */ React123.forwardRef(function MenuPopup2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
finalFocus,
...elementProps
} = componentProps;
const {
store
} = useMenuRootContext();
const {
side: side2,
align: align2
} = useMenuPositionerContext();
const insideToolbar = useToolbarRootContext(true) != null;
const open7 = store.useState("open");
const transitionStatus = store.useState("transitionStatus");
const popupProps = store.useState("popupProps");
const mounted = store.useState("mounted");
const instantType = store.useState("instantType");
const activeTriggerElement = store.useState("activeTriggerElement");
const parent = store.useState("parent");
const lastOpenChangeReason = store.useState("lastOpenChangeReason");
const rootId = store.useState("rootId");
const floatingContext = store.useState("floatingRootContext");
const floatingTreeRoot = store.useState("floatingTreeRoot");
const closeDelay = store.useState("closeDelay");
const hoverEnabled = store.useState("hoverEnabled");
const disabled3 = store.useState("disabled");
const openMethod = store.useState("openMethod");
const isContextMenu = parent.type === "context-menu";
useOpenChangeComplete({
open: open7,
ref: store.context.popupRef,
onComplete() {
if (open7) {
store.context.onOpenChangeComplete?.(true);
}
}
});
React123.useEffect(() => {
function handleClose(event) {
store.setOpen(false, createChangeEventDetails(event.reason, event.domEvent));
}
floatingTreeRoot.events.on("close", handleClose);
return () => {
floatingTreeRoot.events.off("close", handleClose);
};
}, [floatingTreeRoot.events, store]);
useHoverFloatingInteraction(floatingContext, {
enabled: hoverEnabled && !disabled3 && !isContextMenu && parent.type !== "menubar",
closeDelay
});
const setPopupElement = store.useStateSetter("popupElement");
const state = {
transitionStatus,
side: side2,
align: align2,
open: open7,
nested: parent.type === "menu",
instant: instantType
};
const element = useRenderElement("div", componentProps, {
state,
ref: [forwardedRef, store.context.popupRef, setPopupElement],
stateAttributesMapping: popupTransitionStateMapping,
props: [popupProps, {
onKeyDown(event) {
if (insideToolbar && COMPOSITE_KEYS.has(event.key)) {
event.stopPropagation();
}
}
}, getDisabledMountTransitionStyles(transitionStatus), elementProps, {
"data-rootownerid": rootId
}]
});
let returnFocus = parent.type === void 0 || isContextMenu;
if (activeTriggerElement || parent.type === "menubar" && lastOpenChangeReason !== reason_parts_exports.outsidePress) {
returnFocus = true;
}
return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(FloatingFocusManager, {
context: floatingContext,
openInteractionType: openMethod,
modal: isContextMenu,
disabled: !mounted,
returnFocus: finalFocus === void 0 ? returnFocus : finalFocus,
initialFocus: parent.type !== "menu",
restoreFocus: true,
externalTree: parent.type !== "menubar" ? floatingTreeRoot : void 0,
previousFocusableElement: activeTriggerElement,
nextFocusableElement: parent.type === void 0 ? store.context.triggerFocusTargetRef : void 0,
beforeContentFocusGuardRef: parent.type === void 0 ? store.context.beforeContentFocusGuardRef : void 0,
children: element
});
});
if (true) MenuPopup.displayName = "MenuPopup";
// node_modules/@base-ui/react/menu/portal/MenuPortal.mjs
var React125 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/portal/MenuPortalContext.mjs
var React124 = __toESM(require_react(), 1);
var MenuPortalContext = /* @__PURE__ */ React124.createContext(void 0);
if (true) MenuPortalContext.displayName = "MenuPortalContext";
function useMenuPortalContext() {
const value = React124.useContext(MenuPortalContext);
if (value === void 0) {
throw new Error(true ? "Base UI: is missing." : formatErrorMessage_default(32));
}
return value;
}
// node_modules/@base-ui/react/menu/portal/MenuPortal.mjs
var import_jsx_runtime30 = __toESM(require_jsx_runtime(), 1);
var MenuPortal = /* @__PURE__ */ React125.forwardRef(function MenuPortal2(props, forwardedRef) {
const {
keepMounted = false,
...portalProps
} = props;
const {
store,
parent
} = useMenuRootContext();
const mounted = store.useState("mounted");
const shouldRender = mounted || keepMounted;
if (!shouldRender) {
return null;
}
const portalOwnerRole = parent.type === "menu" || parent.type === "menubar" ? "group" : void 0;
return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(MenuPortalContext.Provider, {
value: keepMounted,
children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FloatingPortal, {
ref: forwardedRef,
...portalProps,
portalOwnerRole
})
});
});
if (true) MenuPortal.displayName = "MenuPortal";
// node_modules/@base-ui/react/menu/positioner/MenuPositioner.mjs
var React126 = __toESM(require_react(), 1);
var import_jsx_runtime31 = __toESM(require_jsx_runtime(), 1);
var MenuPositioner = /* @__PURE__ */ React126.forwardRef(function MenuPositioner2(componentProps, forwardedRef) {
const {
anchor: anchorProp,
positionMethod: positionMethodProp = "absolute",
className,
render: render4,
side: side2,
align: alignProp,
sideOffset: sideOffsetProp = 0,
alignOffset: alignOffsetProp = 0,
collisionBoundary = "clipping-ancestors",
collisionPadding = 5,
arrowPadding = 5,
sticky = false,
disableAnchorTracking = false,
collisionAvoidance: collisionAvoidanceProp = DROPDOWN_COLLISION_AVOIDANCE,
style,
...elementProps
} = componentProps;
const {
store
} = useMenuRootContext();
const keepMounted = useMenuPortalContext();
const contextMenuContext = useContextMenuRootContext(true);
const parent = store.useState("parent");
const floatingRootContext = store.useState("floatingRootContext");
const floatingTreeRoot = store.useState("floatingTreeRoot");
const mounted = store.useState("mounted");
const open7 = store.useState("open");
const modal = store.useState("modal");
const openMethod = store.useState("openMethod");
const triggerElement = store.useState("activeTriggerElement");
const transitionStatus = store.useState("transitionStatus");
const positionerElement = store.useState("positionerElement");
const instantType = store.useState("instantType");
const adaptiveOrigin2 = store.useState("adaptiveOrigin");
const lastOpenChangeReason = store.useState("lastOpenChangeReason");
const floatingNodeId = store.useState("floatingNodeId");
const floatingParentNodeId = store.useState("floatingParentNodeId");
const domReference = floatingRootContext.useState("domReferenceElement");
const previousTriggerRef = React126.useRef(null);
const runOnceAnimationsFinish = useAnimationsFinished(positionerElement);
let anchor = anchorProp;
let sideOffset = sideOffsetProp;
let alignOffset = alignOffsetProp;
let align2 = alignProp;
let collisionAvoidance = collisionAvoidanceProp;
if (parent.type === "context-menu") {
anchor = anchorProp ?? parent.context?.anchor;
align2 = align2 ?? "start";
if (!side2 && align2 !== "center") {
alignOffset = componentProps.alignOffset ?? 2;
sideOffset = componentProps.sideOffset ?? -5;
}
}
let computedSide = side2;
let computedAlign = align2;
if (parent.type === "menu") {
computedSide = computedSide ?? "inline-end";
computedAlign = computedAlign ?? "start";
collisionAvoidance = componentProps.collisionAvoidance ?? POPUP_COLLISION_AVOIDANCE;
} else if (parent.type === "menubar") {
computedSide = computedSide ?? (parent.context.orientation === "vertical" ? "inline-end" : "bottom");
computedAlign = computedAlign ?? "start";
}
const contextMenu = parent.type === "context-menu";
const positioner = useAnchorPositioning({
anchor,
floatingRootContext,
positionMethod: contextMenuContext ? "fixed" : positionMethodProp,
mounted,
side: computedSide,
sideOffset,
align: computedAlign,
alignOffset,
arrowPadding: contextMenu ? 0 : arrowPadding,
collisionBoundary,
collisionPadding,
sticky,
nodeId: floatingNodeId,
keepMounted,
disableAnchorTracking,
collisionAvoidance,
shift: contextMenu ? {
crossAxis: !("side" in collisionAvoidance && collisionAvoidance.side === "flip"),
rootBoundary: "layoutViewport"
} : void 0,
externalTree: floatingTreeRoot,
adaptiveOrigin: adaptiveOrigin2
});
React126.useEffect(() => {
function onMenuOpenChange(details) {
if (details.open) {
if (details.parentNodeId === floatingNodeId) {
store.set("hoverEnabled", false);
}
if (details.nodeId !== floatingNodeId && details.parentNodeId === store.select("floatingParentNodeId")) {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.siblingOpen));
}
}
}
floatingTreeRoot.events.on("menuopenchange", onMenuOpenChange);
return () => {
floatingTreeRoot.events.off("menuopenchange", onMenuOpenChange);
};
}, [store, floatingTreeRoot.events, floatingNodeId]);
React126.useEffect(() => {
if (store.select("floatingParentNodeId") == null) {
return void 0;
}
function onParentClose(details) {
if (details.open || details.nodeId !== store.select("floatingParentNodeId")) {
return;
}
const reason = details.reason ?? reason_parts_exports.siblingOpen;
store.setOpen(false, createChangeEventDetails(reason));
}
floatingTreeRoot.events.on("menuopenchange", onParentClose);
return () => {
floatingTreeRoot.events.off("menuopenchange", onParentClose);
};
}, [floatingTreeRoot.events, store]);
const closeTimeout = useTimeout();
React126.useEffect(() => {
if (!open7) {
closeTimeout.clear();
}
}, [open7, closeTimeout]);
React126.useEffect(() => {
function onItemHover(event) {
if (!open7 || event.nodeId !== store.select("floatingParentNodeId")) {
return;
}
if (event.target && triggerElement && triggerElement !== event.target) {
const delay = store.select("closeDelay");
if (delay > 0) {
if (!closeTimeout.isStarted()) {
closeTimeout.start(delay, () => {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.siblingOpen));
});
}
} else {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.siblingOpen));
}
} else {
closeTimeout.clear();
}
}
floatingTreeRoot.events.on("itemhover", onItemHover);
return () => {
floatingTreeRoot.events.off("itemhover", onItemHover);
};
}, [floatingTreeRoot.events, open7, triggerElement, store, closeTimeout]);
React126.useEffect(() => {
const eventDetails = {
open: open7,
nodeId: floatingNodeId,
parentNodeId: floatingParentNodeId,
reason: store.select("lastOpenChangeReason")
};
floatingTreeRoot.events.emit("menuopenchange", eventDetails);
}, [floatingTreeRoot.events, open7, store, floatingNodeId, floatingParentNodeId]);
useIsoLayoutEffect(() => {
const currentTrigger = domReference;
const previousTrigger = previousTriggerRef.current;
if (currentTrigger) {
previousTriggerRef.current = currentTrigger;
}
if (previousTrigger && currentTrigger && currentTrigger !== previousTrigger) {
store.set("instantType", void 0);
const abortController = new AbortController();
runOnceAnimationsFinish(() => {
store.set("instantType", "trigger-change");
}, abortController.signal);
return () => {
abortController.abort();
};
}
return void 0;
}, [domReference, runOnceAnimationsFinish, store]);
const state = {
open: open7,
side: positioner.side,
align: positioner.align,
anchorHidden: positioner.anchorHidden,
nested: parent.type === "menu",
instant: instantType
};
const menubarModal = parent.type === "menubar" && parent.context.modal;
const popupModal = modal && lastOpenChangeReason !== reason_parts_exports.triggerHover;
useAnchoredPopupScrollLock(open7 && (menubarModal || popupModal), openMethod === "touch", positionerElement, triggerElement);
const element = usePositioner(componentProps, state, {
styles: positioner.positionerStyles,
transitionStatus,
props: elementProps,
refs: [forwardedRef, store.useStateSetter("positionerElement")],
hidden: !mounted,
inert: !open7
});
const shouldRenderBackdrop = mounted && parent.type !== "menu" && (parent.type !== "menubar" && modal && lastOpenChangeReason !== reason_parts_exports.triggerHover || parent.type === "menubar" && parent.context.modal);
let backdropCutout = null;
if (parent.type === "menubar") {
backdropCutout = parent.context.contentElement;
} else if (parent.type === void 0) {
backdropCutout = triggerElement;
}
return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(MenuPositionerContext.Provider, {
value: positioner,
children: [shouldRenderBackdrop && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(InternalBackdrop, {
ref: parent.type === "context-menu" || parent.type === "nested-context-menu" ? parent.context.internalBackdropRef : null,
inert: inertValue(!open7),
cutout: backdropCutout
}), /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(FloatingNode, {
id: floatingNodeId,
children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(CompositeList, {
elementsRef: store.context.itemDomElements,
labelsRef: store.context.itemLabels,
children: element
})
})]
});
});
if (true) MenuPositioner.displayName = "MenuPositioner";
// node_modules/@base-ui/react/menu/radio-group/MenuRadioGroup.mjs
var React128 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/radio-group/MenuRadioGroupContext.mjs
var React127 = __toESM(require_react(), 1);
var MenuRadioGroupContext = /* @__PURE__ */ React127.createContext(void 0);
if (true) MenuRadioGroupContext.displayName = "MenuRadioGroupContext";
function useMenuRadioGroupContext() {
const context = React127.useContext(MenuRadioGroupContext);
if (context === void 0) {
throw new Error(true ? "Base UI: MenuRadioGroupContext is missing. MenuRadioGroup parts must be placed within ." : formatErrorMessage_default(34));
}
return context;
}
// node_modules/@base-ui/react/menu/radio-group/MenuRadioGroup.mjs
var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
var MenuRadioGroup = /* @__PURE__ */ React128.memo(/* @__PURE__ */ React128.forwardRef(function MenuRadioGroup2(componentProps, forwardedRef) {
const {
render: render4,
className,
value: valueProp,
defaultValue: defaultValue3,
onValueChange: onValueChangeProp,
disabled: disabled3 = false,
style,
"aria-labelledby": ariaLabelledByProp,
...elementProps
} = componentProps;
const [labelId, setLabelId] = React128.useState(void 0);
const [value, setValueUnwrapped] = useControlled({
controlled: valueProp,
default: defaultValue3,
name: "MenuRadioGroup"
});
const setValue = useStableCallback((newValue, eventDetails) => {
onValueChangeProp?.(newValue, eventDetails);
if (eventDetails.isCanceled) {
return;
}
setValueUnwrapped(newValue);
});
const state = {
disabled: disabled3
};
const element = useRenderElement("div", componentProps, {
state,
ref: forwardedRef,
props: {
role: "group",
"aria-labelledby": ariaLabelledByProp ?? labelId,
"aria-disabled": disabled3 || void 0,
...elementProps
}
});
const context = React128.useMemo(() => ({
value,
setValue,
disabled: disabled3
}), [value, setValue, disabled3]);
return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(MenuGroupContext.Provider, {
value: setLabelId,
children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(MenuRadioGroupContext.Provider, {
value: context,
children: element
})
});
}));
if (true) MenuRadioGroup.displayName = "MenuRadioGroup";
// node_modules/@base-ui/react/menu/radio-item/MenuRadioItem.mjs
var React130 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menu/radio-item/MenuRadioItemContext.mjs
var React129 = __toESM(require_react(), 1);
var MenuRadioItemContext = /* @__PURE__ */ React129.createContext(void 0);
if (true) MenuRadioItemContext.displayName = "MenuRadioItemContext";
function useMenuRadioItemContext() {
const context = React129.useContext(MenuRadioItemContext);
if (context === void 0) {
throw new Error(true ? "Base UI: MenuRadioItemContext is missing. MenuRadioItem parts must be placed within ." : formatErrorMessage_default(35));
}
return context;
}
// node_modules/@base-ui/react/menu/radio-item/MenuRadioItem.mjs
var import_jsx_runtime33 = __toESM(require_jsx_runtime(), 1);
var MenuRadioItem = /* @__PURE__ */ React130.forwardRef(function MenuRadioItem2(componentProps, forwardedRef) {
const {
render: render4,
className,
id: idProp,
label,
nativeButton = false,
disabled: disabledProp = false,
closeOnClick = false,
value,
style,
...elementProps
} = componentProps;
const listItem = useCompositeListItem({
guess: true,
label
});
const menuPositionerContext = useMenuPositionerContext(true);
const id = useBaseUiId(idProp);
const {
store
} = useMenuRootContext();
const highlighted = store.useState("isActive", listItem.index);
const itemProps = store.useState("itemProps");
const {
value: selectedValue,
setValue: setSelectedValue,
disabled: groupDisabled
} = useMenuRadioGroupContext();
const rootDisabled = store.useState("disabled");
const disabled3 = disabledProp || groupDisabled || rootDisabled;
const checked2 = selectedValue === value;
const {
getItemProps,
itemRef
} = useMenuItem({
closeOnClick,
disabled: disabled3,
highlighted,
id,
store,
nativeButton,
nodeId: menuPositionerContext?.context.nodeId,
itemMetadata: REGULAR_ITEM
});
const state = React130.useMemo(() => ({
disabled: disabled3,
highlighted,
checked: checked2
}), [disabled3, highlighted, checked2]);
function handleClick(event) {
const details = createChangeEventDetails(reason_parts_exports.itemPress, event.nativeEvent, void 0, {
preventUnmountOnClose: NOOP
});
setSelectedValue(value, details);
}
const element = useRenderElement("div", componentProps, {
state,
stateAttributesMapping: itemMapping,
props: [itemProps, {
role: "menuitemradio",
"aria-checked": checked2,
onClick: handleClick
}, elementProps, getItemProps],
ref: [itemRef, forwardedRef, listItem.ref]
});
return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MenuRadioItemContext.Provider, {
value: state,
children: element
});
});
if (true) MenuRadioItem.displayName = "MenuRadioItem";
// node_modules/@base-ui/react/menu/radio-item-indicator/MenuRadioItemIndicator.mjs
var React131 = __toESM(require_react(), 1);
var MenuRadioItemIndicator = /* @__PURE__ */ React131.forwardRef(function MenuRadioItemIndicator2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
keepMounted = false,
...elementProps
} = componentProps;
const item = useMenuRadioItemContext();
const indicatorRef = React131.useRef(null);
const {
transitionStatus,
mounted,
setMounted
} = useTransitionStatus(item.checked);
useOpenChangeComplete({
batch: true,
enabled: !item.checked,
open: item.checked,
ref: indicatorRef,
onComplete() {
if (!item.checked) {
setMounted(false);
}
}
});
const state = {
checked: item.checked,
disabled: item.disabled,
highlighted: item.highlighted,
transitionStatus
};
const element = useRenderElement("span", componentProps, {
state,
stateAttributesMapping: itemMapping,
ref: [forwardedRef, indicatorRef],
props: {
"aria-hidden": true,
...elementProps
},
enabled: keepMounted || mounted
});
return element;
});
if (true) MenuRadioItemIndicator.displayName = "MenuRadioItemIndicator";
// node_modules/@base-ui/react/menu/root/MenuRoot.mjs
var React135 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/menubar/MenubarContext.mjs
var React132 = __toESM(require_react(), 1);
var MenubarContext = /* @__PURE__ */ React132.createContext(null);
if (true) MenubarContext.displayName = "MenubarContext";
function useMenubarContext(optional) {
const context = React132.useContext(MenubarContext);
if (context === null && !optional) {
throw new Error(true ? "Base UI: MenubarContext is missing. Menubar parts must be placed within ." : formatErrorMessage_default(5));
}
return context;
}
// node_modules/@base-ui/react/menu/store/MenuStore.mjs
var React133 = __toESM(require_react(), 1);
var selectors4 = {
...popupStoreSelectors,
disabled: (state) => state.parent.type === "menubar" ? state.parent.context.disabled || state.disabled : state.disabled,
modal: (state) => (state.parent.type === void 0 || state.parent.type === "context-menu") && (state.modal ?? true),
openMethod: (state) => state.openMethod,
allowMouseEnter: (state) => state.allowMouseEnter,
highlightItemOnHover: (state) => state.highlightItemOnHover,
parent: (state) => state.parent,
rootId: (state) => {
if (state.parent.type === "menu") {
return state.parent.store.select("rootId");
}
return state.parent.type !== void 0 ? state.parent.context.rootId : state.rootId;
},
activeIndex: (state) => state.activeIndex,
isActive: (state, itemIndex) => state.activeIndex === itemIndex,
hoverEnabled: (state) => state.hoverEnabled,
instantType: (state) => state.instantType,
lastOpenChangeReason: (state) => state.openChangeReason,
floatingTreeRoot: (state) => {
if (state.parent.type === "menu") {
return state.parent.store.select("floatingTreeRoot");
}
return state.floatingTreeRoot;
},
floatingNodeId: (state) => state.floatingNodeId,
floatingParentNodeId: (state) => state.floatingParentNodeId,
itemProps: (state) => state.itemProps,
closeDelay: (state) => state.closeDelay,
adaptiveOrigin: (state) => state.adaptiveOrigin,
keyboardEventRelay: (state) => {
if (state.keyboardEventRelay) {
return state.keyboardEventRelay;
}
if (state.parent.type === "menu") {
return state.parent.store.select("keyboardEventRelay");
}
return void 0;
}
};
var MenuStore = class extends ReactStore {
constructor(initialState, floatingId, nested = false) {
const triggerElements = new PopupTriggerMap();
const state = createInitialState2(triggerElements, floatingId, nested, initialState);
super(state, createInitialContext2(triggerElements), selectors4);
this.unsubscribeParentListener = this.observe("parent", (parent) => {
this.unsubscribeParentListener?.();
if (parent.type === "menu") {
let rootId = parent.store.select("rootId");
let floatingTreeRoot = parent.store.select("floatingTreeRoot");
let keyboardEventRelay = parent.store.select("keyboardEventRelay");
this.unsubscribeParentListener = parent.store.subscribe(() => {
const nextRootId = parent.store.select("rootId");
const nextFloatingTreeRoot = parent.store.select("floatingTreeRoot");
const nextKeyboardEventRelay = parent.store.select("keyboardEventRelay");
if (rootId === nextRootId && floatingTreeRoot === nextFloatingTreeRoot && keyboardEventRelay === nextKeyboardEventRelay) {
return;
}
rootId = nextRootId;
floatingTreeRoot = nextFloatingTreeRoot;
keyboardEventRelay = nextKeyboardEventRelay;
this.notifyAll();
});
this.context.allowMouseUpTriggerRef = parent.store.context.allowMouseUpTriggerRef;
return;
}
if (parent.type !== void 0) {
this.context.allowMouseUpTriggerRef = parent.context.allowMouseUpTriggerRef;
}
this.unsubscribeParentListener = null;
});
}
setOpen(open7, eventDetails) {
this.state.floatingRootContext.context.events.emit("setOpen", {
open: open7,
eventDetails
});
}
unsubscribeParentListener = null;
};
function createNullMenuStore() {
const triggerElements = new PopupTriggerMap();
const store = new NullStore(Object.freeze(createInitialState2(triggerElements)), Object.freeze(createInitialContext2(triggerElements)), selectors4);
return Object.assign(store, {
setOpen: NOOP
});
}
function createInitialContext2(triggerElements) {
return {
positionerRef: /* @__PURE__ */ React133.createRef(),
popupRef: /* @__PURE__ */ React133.createRef(),
typingRef: {
current: false
},
itemDomElements: {
current: []
},
itemLabels: {
current: []
},
allowMouseUpTriggerRef: {
current: false
},
triggerFocusTargetRef: /* @__PURE__ */ React133.createRef(),
beforeContentFocusGuardRef: /* @__PURE__ */ React133.createRef(),
onOpenChangeComplete: void 0,
triggerElements
};
}
function createInitialState2(triggerElements, floatingId, nested = false, initialState) {
return {
...createInitialPopupStoreState(triggerElements, floatingId, nested),
disabled: false,
modal: true,
openMethod: null,
allowMouseEnter: false,
highlightItemOnHover: true,
parent: {
type: void 0
},
rootId: void 0,
activeIndex: null,
hoverEnabled: true,
instantType: void 0,
openChangeReason: null,
floatingTreeRoot: new FloatingTreeStore(),
floatingNodeId: void 0,
floatingParentNodeId: null,
itemProps: EMPTY_OBJECT,
keyboardEventRelay: void 0,
closeDelay: 0,
adaptiveOrigin: void 0,
...initialState
};
}
// node_modules/@base-ui/react/menu/submenu-root/MenuSubmenuRootContext.mjs
var React134 = __toESM(require_react(), 1);
var MenuSubmenuRootContext = /* @__PURE__ */ React134.createContext(void 0);
if (true) MenuSubmenuRootContext.displayName = "MenuSubmenuRootContext";
function useMenuSubmenuRootContext() {
return React134.useContext(MenuSubmenuRootContext);
}
// node_modules/@base-ui/react/menu/root/MenuRoot.mjs
var import_jsx_runtime34 = __toESM(require_jsx_runtime(), 1);
var MenuRoot = fastComponent(function MenuRoot2(props) {
const {
children,
open: openProp,
onOpenChange,
onOpenChangeComplete,
defaultOpen = false,
disabled: disabledProp = false,
modal: modalProp,
loopFocus = true,
orientation = "vertical",
actionsRef,
closeParentOnEsc = false,
handle,
triggerId: triggerIdProp,
defaultTriggerId: defaultTriggerIdProp = null,
highlightItemOnHover = true
} = props;
const contextMenuContext = useContextMenuRootContext(true);
const parentMenuRootContext = useMenuRootContext(true);
const menubarContext = useMenubarContext(true);
const isSubmenu = useMenuSubmenuRootContext();
const parentFromContext = React135.useMemo(() => {
if (isSubmenu && parentMenuRootContext) {
return {
type: "menu",
store: parentMenuRootContext.store
};
}
if (menubarContext) {
return {
type: "menubar",
context: menubarContext
};
}
if (contextMenuContext && !parentMenuRootContext) {
return {
type: "context-menu",
context: contextMenuContext
};
}
return {
type: void 0
};
}, [contextMenuContext, parentMenuRootContext, menubarContext, isSubmenu]);
const rootId = useId();
const floatingId = useId();
const floatingParentNodeIdFromContext = useFloatingParentNodeId();
const parentMenuStore = parentFromContext.type === "menu" ? parentFromContext.store : void 0;
const animateInitialOpen = (openProp ?? defaultOpen) && parentMenuStore?.state.transitionStatus === "starting";
const seededInstantType = useRefWithInit(() => animateInitialOpen ? parentMenuStore?.state.instantType : void 0).current;
const store = useMenuRootStore({
open: defaultOpen,
openProp,
activeTriggerId: defaultTriggerIdProp,
triggerIdProp,
parent: parentFromContext,
disabled: disabledProp,
highlightItemOnHover,
modal: parentFromContext.type === void 0 ? modalProp : void 0,
rootId,
instantType: seededInstantType
}, floatingId, floatingParentNodeIdFromContext != null);
store.useControlledProp("openProp", openProp);
store.useControlledProp("triggerIdProp", triggerIdProp);
store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete);
const floatingTreeRoot = store.useState("floatingTreeRoot");
const floatingNodeIdFromContext = useFloatingNodeId(floatingTreeRoot);
const open7 = store.useState("open");
const activeTriggerElement = store.useState("activeTriggerElement");
const positionerElement = store.useState("positionerElement");
const hoverEnabled = store.useState("hoverEnabled");
const disabled3 = store.useState("disabled");
const lastOpenChangeReason = store.useState("lastOpenChangeReason");
const parent = store.useState("parent");
const activeIndex = store.useState("activeIndex");
const payload = store.useState("payload");
const floatingParentNodeId = store.useState("floatingParentNodeId");
const openEventRef = React135.useRef(null);
const allowOutsidePressDismissalRef = React135.useRef(parent.type !== "context-menu");
const allowOutsidePressDismissalTimeout = useTimeout();
const allowTouchToCloseRef = React135.useRef(true);
const allowTouchToCloseTimeout = useTimeout();
const nested = floatingParentNodeId != null;
if (true) {
if (parent.type !== void 0 && modalProp !== void 0) {
console.warn("Base UI: The `modal` prop is not supported on nested menus. It will be ignored.");
}
}
const {
openMethod,
triggerProps: interactionTypeProps
} = useOpenInteractionType(open7);
store.useSyncedValues({
disabled: disabledProp,
highlightItemOnHover,
modal: parent.type === void 0 ? modalProp : void 0,
openMethod,
rootId
});
useImplicitActiveTrigger(store);
const {
forceUnmount,
transitionStatus
} = useOpenStateTransitions(open7, store, () => {
store.set("allowMouseEnter", false);
}, animateInitialOpen);
const runOnceAnimationsFinish = useAnimationsFinished(store.context.popupRef);
React135.useEffect(() => {
if (seededInstantType === void 0) {
return void 0;
}
const clearSeededInstantType = () => {
if (store.state.instantType === seededInstantType) {
store.set("instantType", void 0);
}
};
if (!open7) {
clearSeededInstantType();
return void 0;
}
if (transitionStatus !== void 0) {
return void 0;
}
if (store.context.popupRef.current == null) {
clearSeededInstantType();
return void 0;
}
const abortController = new AbortController();
runOnceAnimationsFinish(clearSeededInstantType, abortController.signal);
return () => {
abortController.abort();
};
}, [seededInstantType, open7, transitionStatus, runOnceAnimationsFinish, store]);
useIsoLayoutEffect(() => {
if (contextMenuContext && !parentMenuRootContext) {
store.update({
parent: {
type: "context-menu",
context: contextMenuContext
},
floatingNodeId: floatingNodeIdFromContext,
floatingParentNodeId: floatingParentNodeIdFromContext
});
} else if (parentMenuRootContext) {
store.update({
floatingNodeId: floatingNodeIdFromContext,
floatingParentNodeId: floatingParentNodeIdFromContext
});
}
}, [contextMenuContext, parentMenuRootContext, floatingNodeIdFromContext, floatingParentNodeIdFromContext, store]);
React135.useEffect(() => {
if (!open7) {
openEventRef.current = null;
}
if (parent.type !== "context-menu") {
return;
}
if (!open7) {
allowOutsidePressDismissalTimeout.clear();
allowOutsidePressDismissalRef.current = false;
return;
}
allowOutsidePressDismissalTimeout.start(500, () => {
allowOutsidePressDismissalRef.current = true;
});
}, [allowOutsidePressDismissalTimeout, open7, parent.type]);
useIsoLayoutEffect(() => {
if (!open7 && !hoverEnabled) {
store.set("hoverEnabled", true);
}
}, [open7, hoverEnabled, store]);
const setOpen = useStableCallback((nextOpen, eventDetails) => {
const reason = eventDetails.reason;
if (!nextOpen && !store.select("open")) {
return;
}
if (open7 === nextOpen && eventDetails.trigger === activeTriggerElement && lastOpenChangeReason === reason) {
return;
}
const shouldPreventUnmountOnClose = attachPreventUnmountOnClose(eventDetails);
if (!nextOpen && eventDetails.trigger == null) {
eventDetails.trigger = activeTriggerElement ?? void 0;
}
onOpenChange?.(nextOpen, eventDetails);
if (eventDetails.isCanceled) {
return;
}
store.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);
const nativeEvent = eventDetails.event;
if (nextOpen === false && nativeEvent?.type === "click" && nativeEvent.pointerType === "touch" && !allowTouchToCloseRef.current) {
return;
}
if (nextOpen && reason === reason_parts_exports.triggerFocus) {
allowTouchToCloseRef.current = false;
allowTouchToCloseTimeout.start(300, () => {
allowTouchToCloseRef.current = true;
});
} else {
allowTouchToCloseRef.current = true;
allowTouchToCloseTimeout.clear();
}
const isKeyboardClick = (reason === reason_parts_exports.triggerPress || reason === reason_parts_exports.itemPress) && nativeEvent.detail === 0;
const isDismissClose = !nextOpen && (reason === reason_parts_exports.escapeKey || reason == null);
openEventRef.current = eventDetails.event;
const popupOpenState = createPopupOpenState(store.state, nextOpen, eventDetails.trigger, shouldPreventUnmountOnClose());
popupOpenState.openChangeReason = reason;
if (parent.type === "menubar" && (reason === reason_parts_exports.triggerFocus || reason === reason_parts_exports.focusOut || reason === reason_parts_exports.triggerHover || reason === reason_parts_exports.listNavigation || reason === reason_parts_exports.siblingOpen)) {
popupOpenState.instantType = "group";
} else if (isKeyboardClick || isDismissClose) {
popupOpenState.instantType = isKeyboardClick ? "click" : "dismiss";
} else {
popupOpenState.instantType = void 0;
}
store.update(popupOpenState);
});
const floatingRootContext = useSyncedFloatingRootContext({
popupStore: store,
floatingRootContext: store.state.floatingRootContext,
floatingId,
nested: floatingParentNodeIdFromContext != null,
onOpenChange: setOpen
});
const floatingEvents = floatingRootContext.context.events;
useIsoLayoutEffect(() => {
const handleSetOpenEvent = ({
open: nextOpen,
eventDetails
}) => setOpen(nextOpen, eventDetails);
floatingEvents.on("setOpen", handleSetOpenEvent);
return () => {
floatingEvents?.off("setOpen", handleSetOpenEvent);
};
}, [floatingEvents, setOpen]);
const handleImperativeClose = React135.useCallback(() => {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.imperativeAction));
}, [store]);
React135.useImperativeHandle(actionsRef, () => ({
unmount: forceUnmount,
close: handleImperativeClose
}), [forceUnmount, handleImperativeClose]);
let ctx8;
if (parent.type === "context-menu") {
ctx8 = parent.context;
}
React135.useImperativeHandle(ctx8?.positionerRef, () => positionerElement, [positionerElement]);
React135.useImperativeHandle(ctx8?.actionsRef, () => ({
setOpen
}), [setOpen]);
const dismiss = useDismiss(floatingRootContext, {
enabled: !disabled3,
bubbles: {
escapeKey: closeParentOnEsc && parent.type === "menu"
},
outsidePress() {
if (parent.type !== "context-menu" || openEventRef.current?.type === "contextmenu") {
return true;
}
return allowOutsidePressDismissalRef.current;
},
externalTree: nested ? floatingTreeRoot : void 0
});
const direction = useDirection();
const setActiveIndex = React135.useCallback((index2) => {
if (store.select("activeIndex") === index2) {
return;
}
store.set("activeIndex", index2);
}, [store]);
const listNavigation2 = useListNavigation(floatingRootContext, {
enabled: !disabled3,
listRef: store.context.itemDomElements,
activeIndex,
nested: parent.type !== void 0,
loopFocus,
orientation,
parentOrientation: parent.type === "menubar" ? parent.context.orientation : void 0,
rtl: direction === "rtl",
disabledIndices: EMPTY_ARRAY,
onNavigate: setActiveIndex,
openOnArrowKeyDown: parent.type !== "context-menu",
externalTree: nested ? floatingTreeRoot : void 0,
focusItemOnHover: highlightItemOnHover
});
const onTyping = React135.useCallback((nextTyping) => {
store.context.typingRef.current = nextTyping;
}, [store]);
const typeahead = useTypeahead(floatingRootContext, {
enabled: !disabled3,
listRef: store.context.itemLabels,
elementsRef: store.context.itemDomElements,
activeIndex,
resetMs: TYPEAHEAD_RESET_MS,
onMatch: (index2) => {
if (open7 && index2 !== activeIndex) {
store.set("activeIndex", index2);
}
},
onTyping
});
const activeTriggerProps = React135.useMemo(() => {
const mergedProps = mergeProps(typeahead.reference, listNavigation2.reference, dismiss.reference, {
onMouseMove() {
store.set("allowMouseEnter", true);
}
}, interactionTypeProps);
mergedProps["aria-haspopup"] = "menu";
mergedProps["aria-expanded"] = open7;
return mergedProps;
}, [store, typeahead.reference, listNavigation2.reference, dismiss.reference, interactionTypeProps, open7]);
const inactiveTriggerProps = React135.useMemo(() => {
const mergedProps = mergeProps(listNavigation2.trigger, dismiss.trigger, interactionTypeProps);
mergedProps["aria-haspopup"] = "menu";
mergedProps["aria-expanded"] = false;
return mergedProps;
}, [listNavigation2.trigger, dismiss.trigger, interactionTypeProps]);
useRefWithInit(() => {
store.update({
inactiveTriggerProps
});
return null;
});
const popupProps = React135.useMemo(() => mergeProps(FOCUSABLE_POPUP_PROPS, {
id: floatingId,
role: "menu",
// `menu` is implicitly vertical, so only the non-default value needs to be rendered.
"aria-orientation": orientation === "horizontal" ? "horizontal" : void 0,
"aria-labelledby": activeTriggerElement?.id,
onMouseMove() {
store.set("allowMouseEnter", true);
if (parent.type === "menu") {
store.set("hoverEnabled", false);
}
},
onClick() {
if (store.select("hoverEnabled")) {
store.set("hoverEnabled", false);
}
},
onKeyDown(event) {
const relay = store.select("keyboardEventRelay");
if (relay && !event.isPropagationStopped()) {
relay(event);
}
}
}, typeahead.floating, listNavigation2.floating, dismiss.floating), [activeTriggerElement, floatingId, orientation, parent.type, store, typeahead.floating, listNavigation2.floating, dismiss.floating]);
const itemProps = listNavigation2.item ?? EMPTY_OBJECT;
usePopupInteractionProps(store, {
floatingRootContext,
activeTriggerProps,
inactiveTriggerProps,
popupProps,
itemProps
});
const context = React135.useMemo(() => ({
store,
parent: parentFromContext
}), [store, parentFromContext]);
const content = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(MenuRootContext.Provider, {
value: context,
children: [handle && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(PopupHandleAttachment, {
handle,
store
}), typeof children === "function" ? children({
payload
}) : children]
});
if (parent.type === void 0 || parent.type === "context-menu") {
return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(FloatingTree, {
externalTree: floatingTreeRoot,
children: content
});
}
return content;
});
if (true) MenuRoot.displayName = "MenuRoot";
function useMenuRootStore(initialState, floatingId, nested) {
const store = useRefWithInit(() => new MenuStore(initialState, floatingId, nested)).current;
return store;
}
// node_modules/@base-ui/react/menu/submenu-root/MenuSubmenuRoot.mjs
var React136 = __toESM(require_react(), 1);
var import_jsx_runtime35 = __toESM(require_jsx_runtime(), 1);
function MenuSubmenuRoot(props) {
const parentMenu = useMenuRootContext().store;
const contextValue = React136.useMemo(() => ({
parentMenu
}), [parentMenu]);
return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(MenuSubmenuRootContext.Provider, {
value: contextValue,
children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(MenuRoot, {
...props
})
});
}
// node_modules/@base-ui/react/menu/trigger/MenuTrigger.mjs
var React140 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/internals/composite/item/useCompositeItem.mjs
var React137 = __toESM(require_react(), 1);
function useCompositeItem(params = {}) {
const {
highlightItemOnHover,
highlightedIndex,
onHighlightedIndexChange
} = useCompositeRootContext();
const {
ref,
index: index2
} = useCompositeListItem(params);
const isHighlighted = highlightedIndex === index2;
const itemRef = React137.useRef(null);
const mergedRef = useMergedRefs(ref, itemRef);
const compositeProps = {
tabIndex: isHighlighted ? 0 : -1,
onFocus() {
onHighlightedIndexChange(index2);
},
onMouseMove() {
const item = itemRef.current;
if (!highlightItemOnHover || !item) {
return;
}
const disabled3 = item.hasAttribute("disabled") || item.ariaDisabled === "true";
if (!isHighlighted && !disabled3) {
item.focus();
}
}
};
return {
compositeProps,
compositeRef: mergedRef,
index: index2
};
}
// node_modules/@base-ui/react/internals/composite/item/CompositeItem.mjs
function CompositeItem(componentProps) {
const {
render: render4,
className,
style,
state = EMPTY_OBJECT,
props = EMPTY_ARRAY,
refs = EMPTY_ARRAY,
metadata,
stateAttributesMapping: stateAttributesMapping10,
tag = "div",
...elementProps
} = componentProps;
const {
compositeProps,
compositeRef
} = useCompositeItem({
metadata
});
return useRenderElement(tag, componentProps, {
state,
// The composite ref attaches first so an outer item wins when nested items share a DOM node.
ref: [compositeRef, ...refs],
props: [compositeProps, ...props, elementProps],
stateAttributesMapping: stateAttributesMapping10
});
}
// node_modules/@base-ui/react/menu/utils/findRootOwnerId.mjs
function findRootOwnerId(node) {
if (isHTMLElement(node) && node.hasAttribute("data-rootownerid")) {
return node.getAttribute("data-rootownerid");
}
if (isLastTraversableNode(node)) {
return void 0;
}
return findRootOwnerId(getParentNode(node));
}
// node_modules/@base-ui/react/utils/popups/useTriggerFocusGuards.mjs
var React138 = __toESM(require_react(), 1);
var ReactDOM7 = __toESM(require_react_dom(), 1);
function useTriggerFocusGuards(store, triggerElementRef) {
const preFocusGuardRef = React138.useRef(null);
function handlePreFocusGuardFocus(event) {
ReactDOM7.flushSync(() => {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent, event.currentTarget));
});
const previousTabbable = getTabbableBeforeElement(preFocusGuardRef.current);
previousTabbable?.focus();
}
function handleFocusTargetFocus(event) {
const positionerElement = store.select("positionerElement");
if (positionerElement && isOutsideEvent(event, positionerElement)) {
store.context.beforeContentFocusGuardRef.current?.focus();
} else {
ReactDOM7.flushSync(() => {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.focusOut, event.nativeEvent, event.currentTarget));
});
let nextTabbable = getTabbableAfterElement(store.context.triggerFocusTargetRef.current || triggerElementRef.current);
while (nextTabbable !== null && contains(positionerElement, nextTabbable)) {
const prevTabbable = nextTabbable;
nextTabbable = getNextTabbable(nextTabbable);
if (nextTabbable === prevTabbable) {
break;
}
}
nextTabbable?.focus();
}
}
return {
preFocusGuardRef,
handlePreFocusGuardFocus,
handleFocusTargetFocus
};
}
// node_modules/@base-ui/react/utils/useMixedToggleClickHandler.mjs
var React139 = __toESM(require_react(), 1);
function useMixedToggleClickHandler(params) {
const {
enabled = true,
mouseDownAction,
open: open7
} = params;
const ignoreClickRef = React139.useRef(false);
return React139.useMemo(() => {
if (!enabled) {
return EMPTY_OBJECT;
}
return {
onMouseDown: (event) => {
if (mouseDownAction === "open" && !open7 || mouseDownAction === "close" && open7) {
ignoreClickRef.current = true;
ownerDocument(event.currentTarget).addEventListener("click", () => {
ignoreClickRef.current = false;
}, {
once: true
});
}
},
onClick: (event) => {
if (ignoreClickRef.current) {
ignoreClickRef.current = false;
event.preventBaseUIHandler();
}
}
};
}, [enabled, mouseDownAction, open7]);
}
// node_modules/@base-ui/react/menu/trigger/MenuTrigger.mjs
var import_jsx_runtime36 = __toESM(require_jsx_runtime(), 1);
var MenuTrigger = fastComponentRef(function MenuTrigger2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
disabled: disabledProp = false,
nativeButton = true,
id: idProp,
openOnHover: openOnHoverProp,
delay = 100,
closeDelay = 0,
handle,
payload,
...elementProps
} = componentProps;
const rootContext = useMenuRootContext(true);
const handleStore = usePopupHandleStore(handle);
const store = handleStore ?? rootContext?.store;
if (!store) {
throw new Error(true ? "Base UI: must be either used within a component or provided with a handle." : formatErrorMessage_default(85));
}
const thisTriggerId = useBaseUiId(idProp);
const isTriggerActive = store.useState("isTriggerActive", thisTriggerId);
const floatingRootContext = store.useState("floatingRootContext");
const isOpenedByThisTrigger = store.useState("isOpenedByTrigger", thisTriggerId);
const popupId = store.useState("triggerPopupId", thisTriggerId);
const triggerElementRef = React140.useRef(null);
const parent = useMenuParent();
const compositeRootContext = useCompositeRootContext(true);
const floatingTreeRootFromContext = useFloatingTree();
const floatingTreeRoot = React140.useMemo(() => {
return floatingTreeRootFromContext ?? new FloatingTreeStore();
}, [floatingTreeRootFromContext]);
const floatingNodeId = useFloatingNodeId(floatingTreeRoot);
const floatingParentNodeId = useFloatingParentNodeId();
const {
registerTrigger,
isMountedByThisTrigger
} = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {
payload,
closeDelay,
parent,
floatingTreeRoot,
floatingNodeId,
floatingParentNodeId,
keyboardEventRelay: compositeRootContext?.relayKeyboardEvent
});
const isInMenubar = parent.type === "menubar";
const rootDisabled = store.useState("disabled");
const disabled3 = disabledProp || rootDisabled || isInMenubar && parent.context.disabled;
const {
getButtonProps,
buttonRef
} = useButton({
disabled: disabled3,
native: nativeButton
});
React140.useEffect(() => {
if (!isOpenedByThisTrigger && parent.type === void 0) {
store.context.allowMouseUpTriggerRef.current = false;
}
}, [store, isOpenedByThisTrigger, parent.type]);
const triggerRef = React140.useRef(null);
const allowMouseUpTriggerTimeout = useTimeout();
const handleDocumentMouseUp = useStableCallback((mouseEvent) => {
if (!triggerRef.current) {
return;
}
allowMouseUpTriggerTimeout.clear();
store.context.allowMouseUpTriggerRef.current = false;
const mouseUpTarget = mouseEvent.target;
if (contains(triggerRef.current, mouseUpTarget) || contains(store.select("positionerElement"), mouseUpTarget) || mouseUpTarget === triggerRef.current) {
return;
}
if (mouseUpTarget != null && findRootOwnerId(mouseUpTarget) === store.select("rootId")) {
return;
}
if (isMouseWithinBounds(mouseEvent, triggerRef.current)) {
return;
}
floatingTreeRoot.events.emit("close", {
domEvent: mouseEvent,
reason: reason_parts_exports.cancelOpen
});
});
React140.useEffect(() => {
if (isOpenedByThisTrigger && store.select("lastOpenChangeReason") === reason_parts_exports.triggerHover) {
const doc = ownerDocument(triggerRef.current);
doc.addEventListener("mouseup", handleDocumentMouseUp, {
once: true
});
}
}, [isOpenedByThisTrigger, handleDocumentMouseUp, store]);
const parentMenubarHasSubmenuOpen = isInMenubar && parent.context.hasSubmenuOpen;
const openOnHover = openOnHoverProp ?? parentMenubarHasSubmenuOpen;
const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
enabled: openOnHover && !disabled3 && (!isInMenubar || parentMenubarHasSubmenuOpen && !isMountedByThisTrigger),
handleClose: safePolygon({
blockPointerEvents: !isInMenubar
}),
mouseOnly: true,
move: false,
restMs: parent.type === void 0 ? delay : void 0,
delay: {
close: closeDelay
},
triggerElementRef,
externalTree: floatingTreeRoot,
isActiveTrigger: isTriggerActive,
isClosing: () => store.select("transitionStatus") === "ending"
});
const stickIfOpen = useStickIfOpen(isOpenedByThisTrigger, store.select("lastOpenChangeReason"));
const click = useClick(floatingRootContext, {
enabled: !disabled3,
event: isOpenedByThisTrigger && isInMenubar ? "click" : "mousedown",
toggle: true,
ignoreMouse: false,
stickIfOpen: parent.type === void 0 ? stickIfOpen : false
});
const focus = useFocus(floatingRootContext, {
enabled: !disabled3 && parentMenubarHasSubmenuOpen
});
const mixedToggleHandlers = useMixedToggleClickHandler({
open: isOpenedByThisTrigger,
enabled: isInMenubar,
mouseDownAction: "open"
});
const localInteractionProps = React140.useMemo(() => mergeProps(focus.reference, click.reference), [focus.reference, click.reference]);
const rootTriggerProps = store.useState("triggerProps", isMountedByThisTrigger);
const {
preFocusGuardRef,
handlePreFocusGuardFocus,
handleFocusTargetFocus
} = useTriggerFocusGuards(store, triggerElementRef);
const state = {
disabled: disabled3,
open: isOpenedByThisTrigger
};
const ref = [triggerRef, forwardedRef, buttonRef, registerTrigger, triggerElementRef];
const props = [localInteractionProps, hoverProps ?? EMPTY_OBJECT, rootTriggerProps, {
"aria-haspopup": "menu",
"aria-controls": popupId,
id: thisTriggerId,
onMouseDown: (event) => {
if (store.select("open")) {
return;
}
allowMouseUpTriggerTimeout.start(200, () => {
store.context.allowMouseUpTriggerRef.current = true;
});
const doc = ownerDocument(event.currentTarget);
doc.addEventListener("mouseup", handleDocumentMouseUp, {
once: true
});
}
}, isInMenubar ? {
role: "menuitem"
} : {}, mixedToggleHandlers, elementProps, getButtonProps];
const element = useRenderElement("button", componentProps, {
enabled: !isInMenubar,
stateAttributesMapping: pressableTriggerOpenStateMapping,
state,
ref,
props
});
if (isInMenubar) {
return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(CompositeItem, {
tag: "button",
render: render4,
className,
style,
state,
refs: ref,
props,
stateAttributesMapping: pressableTriggerOpenStateMapping
});
}
if (isOpenedByThisTrigger) {
return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(React140.Fragment, {
children: [/* @__PURE__ */ (0, import_jsx_runtime36.jsx)(FocusGuard, {
ref: preFocusGuardRef,
onFocus: handlePreFocusGuardFocus
}, `${thisTriggerId}-pre-focus-guard`), /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(React140.Fragment, {
children: element
}, thisTriggerId), /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(FocusGuard, {
ref: store.context.triggerFocusTargetRef,
onFocus: handleFocusTargetFocus
}, `${thisTriggerId}-post-focus-guard`)]
});
}
return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(React140.Fragment, {
children: element
}, thisTriggerId);
});
if (true) MenuTrigger.displayName = "MenuTrigger";
function useStickIfOpen(open7, openReason) {
const stickIfOpenTimeout = useTimeout();
const [stickIfOpen, setStickIfOpen] = React140.useState(false);
useIsoLayoutEffect(() => {
if (open7 && openReason === reason_parts_exports.triggerHover) {
setStickIfOpen(true);
stickIfOpenTimeout.start(PATIENT_CLICK_THRESHOLD, () => {
setStickIfOpen(false);
});
} else if (!open7) {
stickIfOpenTimeout.clear();
setStickIfOpen(false);
}
}, [open7, openReason, stickIfOpenTimeout]);
return stickIfOpen;
}
function useMenuParent() {
const menubarContext = useMenubarContext(true);
const parent = React140.useMemo(() => {
if (menubarContext) {
return {
type: "menubar",
context: menubarContext
};
}
return {
type: void 0
};
}, [menubarContext]);
return parent;
}
// node_modules/@base-ui/react/menu/viewport/MenuViewport.mjs
var React145 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/utils/usePopupViewport.mjs
var React144 = __toESM(require_react(), 1);
var ReactDOM8 = __toESM(require_react_dom(), 1);
// node_modules/@base-ui/utils/usePreviousValue.mjs
var React141 = __toESM(require_react(), 1);
function usePreviousValue(value) {
const [state, setState] = React141.useState({
current: value,
previous: null
});
if (!Object.is(value, state.current)) {
setState({
current: value,
previous: state.current
});
}
return state.previous;
}
// node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
var React142 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/utils/getCssDimensions.mjs
function getCssDimensions2(element) {
const css = getComputedStyle2(element);
let width = parseFloat(css.width) || 0;
let height2 = parseFloat(css.height) || 0;
const hasOffset = isHTMLElement(element);
const offsetWidth = hasOffset ? element.offsetWidth : width;
const offsetHeight = hasOffset ? element.offsetHeight : height2;
const shouldFallback = round(width) !== offsetWidth || round(height2) !== offsetHeight;
if (shouldFallback) {
width = offsetWidth;
height2 = offsetHeight;
}
return {
width,
height: height2
};
}
// node_modules/@base-ui/react/utils/CommonPopupCssVars.mjs
var popupWidth = "--popup-width";
var popupHeight = "--popup-height";
// node_modules/@base-ui/react/utils/usePopupAutoResize.mjs
function usePopupAutoResize(parameters) {
const {
popupElement,
positionerElement,
content,
mounted,
onMeasureLayout: onMeasureLayoutParam,
onMeasureLayoutComplete: onMeasureLayoutCompleteParam,
side: side2,
direction
} = parameters;
const runOnceAnimationsFinish = useAnimationsFinished(popupElement, true);
const animationFrame = useAnimationFrame();
const committedDimensionsRef = React142.useRef(null);
const isInitialRenderRef = React142.useRef(true);
const restoreAnchoringStylesRef = React142.useRef(NOOP);
const onMeasureLayout = useStableCallback(onMeasureLayoutParam);
const onMeasureLayoutComplete = useStableCallback(onMeasureLayoutCompleteParam);
const anchoringStyles = React142.useMemo(() => getPopupAnchoringStyles(side2, direction), [side2, direction]);
useIsoLayoutEffect(() => {
if (!mounted) {
restoreAnchoringStylesRef.current = NOOP;
isInitialRenderRef.current = true;
committedDimensionsRef.current = null;
return void 0;
}
if (!popupElement || !positionerElement) {
return void 0;
}
restoreAnchoringStylesRef.current = applyElementStyles(popupElement, anchoringStyles);
setPopupCssSize(popupElement, "auto");
const restorePopupPosition = overrideElementStyle(popupElement, "position", "static");
const restorePopupTransform = overrideElementStyle(popupElement, "transform", "none");
const restorePopupScale = overrideElementStyle(popupElement, "scale", "1");
const restorePositionerAvailableSize = applyElementStyles(positionerElement, {
[availableWidth]: "max-content",
[availableHeight]: "max-content"
});
function restoreMeasurementOverrides() {
restorePopupPosition();
restorePopupTransform();
restorePositionerAvailableSize();
}
function restoreMeasurementOverridesIncludingScale() {
restoreMeasurementOverrides();
restorePopupScale();
}
onMeasureLayout?.();
if (isInitialRenderRef.current || committedDimensionsRef.current === null) {
setPositionerCssSize(positionerElement, "max-content");
const dimensions = getCssDimensions2(popupElement);
committedDimensionsRef.current = dimensions;
setPositionerCssSize(positionerElement, dimensions);
restoreMeasurementOverridesIncludingScale();
onMeasureLayoutComplete?.(null, dimensions);
isInitialRenderRef.current = false;
return () => {
restoreAnchoringStylesRef.current();
restoreAnchoringStylesRef.current = NOOP;
};
}
setPositionerCssSize(positionerElement, "max-content");
const previousDimensions = committedDimensionsRef.current;
const newDimensions = getCssDimensions2(popupElement);
committedDimensionsRef.current = newDimensions;
setPopupCssSize(popupElement, previousDimensions);
restoreMeasurementOverridesIncludingScale();
onMeasureLayoutComplete?.(previousDimensions, newDimensions);
setPositionerCssSize(positionerElement, newDimensions);
const abortController = new AbortController();
animationFrame.request(() => {
setPopupCssSize(popupElement, newDimensions);
runOnceAnimationsFinish(() => {
popupElement.style.setProperty(popupWidth, "auto");
popupElement.style.setProperty(popupHeight, "auto");
}, abortController.signal);
});
return () => {
abortController.abort();
animationFrame.cancel();
restoreAnchoringStylesRef.current();
restoreAnchoringStylesRef.current = NOOP;
};
}, [content, popupElement, positionerElement, runOnceAnimationsFinish, animationFrame, mounted, onMeasureLayout, onMeasureLayoutComplete, anchoringStyles]);
}
function getPopupAnchoringStyles(side2, direction) {
const isPhysicalTop = side2 === "top";
const isPhysicalLeft = side2 === "left" || side2 === (direction === "rtl" ? "inline-end" : "inline-start");
if (!isPhysicalTop && !isPhysicalLeft) {
return EMPTY_OBJECT;
}
return {
position: "absolute",
[isPhysicalTop ? "bottom" : "top"]: "0",
[isPhysicalLeft ? "right" : "left"]: "0"
};
}
function overrideElementStyle(element, property, value) {
const originalValue = element.style.getPropertyValue(property);
element.style.setProperty(property, value);
return () => {
element.style.setProperty(property, originalValue);
};
}
function applyElementStyles(element, styles) {
const restorers = [];
for (const [key2, value] of Object.entries(styles)) {
restorers.push(overrideElementStyle(element, key2, value));
}
return restorers.length ? () => {
restorers.forEach((restore) => restore());
} : NOOP;
}
function setPopupCssSize(popupElement, size4) {
const width = size4 === "auto" ? "auto" : `${size4.width}px`;
const height2 = size4 === "auto" ? "auto" : `${size4.height}px`;
popupElement.style.setProperty(popupWidth, width);
popupElement.style.setProperty(popupHeight, height2);
}
function setPositionerCssSize(positionerElement, size4) {
const width = size4 === "max-content" ? "max-content" : `${size4.width}px`;
const height2 = size4 === "max-content" ? "max-content" : `${size4.height}px`;
positionerElement.style.setProperty(positionerWidth, width);
positionerElement.style.setProperty(positionerHeight, height2);
}
// node_modules/@base-ui/react/direction-provider/DirectionProvider.mjs
var React143 = __toESM(require_react(), 1);
var import_jsx_runtime37 = __toESM(require_jsx_runtime(), 1);
var DirectionProvider = function DirectionProvider2(props) {
const {
direction = "ltr"
} = props;
const contextValue = React143.useMemo(() => ({
direction
}), [direction]);
return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(DirectionContext.Provider, {
value: contextValue,
children: props.children
});
};
if (true) DirectionProvider.displayName = "DirectionProvider";
// node_modules/@base-ui/react/utils/adaptiveOriginMiddleware.mjs
var adaptiveOrigin = {
name: "adaptiveOrigin",
async fn(state) {
const {
x: rawX,
y: rawY,
rects: {
floating: floatRect
},
elements: {
floating
},
platform: platform3,
strategy,
placement
} = state;
const win = getWindow(floating);
const styles = win.getComputedStyle(floating);
const hasTransition = styles.transitionDuration !== "0s" && styles.transitionDuration !== "";
if (!hasTransition) {
return {
x: rawX,
y: rawY,
data: DEFAULT_SIDES
};
}
const offsetParent = await platform3.getOffsetParent?.(floating);
let offsetDimensions = {
width: 0,
height: 0
};
if (strategy === "fixed" && win?.visualViewport) {
offsetDimensions = {
width: win.visualViewport.width,
height: win.visualViewport.height
};
} else if (offsetParent === win) {
const doc = ownerDocument(floating);
offsetDimensions = {
width: doc.documentElement.clientWidth,
height: doc.documentElement.clientHeight
};
} else if (await platform3.isElement?.(offsetParent)) {
offsetDimensions = await platform3.getDimensions(offsetParent);
}
const currentSide = getSide(placement);
let x2 = rawX;
let y2 = rawY;
if (currentSide === "left") {
x2 = offsetDimensions.width - (rawX + floatRect.width);
}
if (currentSide === "top") {
y2 = offsetDimensions.height - (rawY + floatRect.height);
}
const sideX = currentSide === "left" ? "right" : DEFAULT_SIDES.sideX;
const sideY = currentSide === "top" ? "bottom" : DEFAULT_SIDES.sideY;
return {
x: x2,
y: y2,
data: {
sideX,
sideY
}
};
}
};
// node_modules/@base-ui/react/utils/CommonViewportDataAttributes.mjs
var activationDirection = "data-activation-direction";
// node_modules/@base-ui/react/utils/usePopupViewport.mjs
var import_jsx_runtime38 = __toESM(require_jsx_runtime(), 1);
var popupViewportStateMapping = {
activationDirection: (value) => value ? {
[activationDirection]: value
} : null
};
function usePopupViewport(parameters) {
const {
store,
side: side2,
children
} = parameters;
const direction = useDirection();
const activeTrigger = store.useState("activeTriggerElement");
const activeTriggerId = store.useState("activeTriggerId");
const open7 = store.useState("open");
const payload = store.useState("payload");
const mounted = store.useState("mounted");
const popupElement = store.useState("popupElement");
const positionerElement = store.useState("positionerElement");
const previousActiveTrigger = usePreviousValue(open7 ? activeTrigger : null);
const currentContentKey = usePopupContentKey(activeTriggerId, payload);
const capturedNodeRef = React144.useRef(null);
const [previousContentNode, setPreviousContentNode] = React144.useState(null);
const [newTriggerOffset, setNewTriggerOffset] = React144.useState(null);
const currentContainerRef = React144.useRef(null);
const previousContainerRef = React144.useRef(null);
const onAnimationsFinished = useAnimationsFinished(currentContainerRef, true);
const cleanupFrame = useAnimationFrame();
const cleanupControllerRef = React144.useRef(null);
const [previousContentDimensions, setPreviousContentDimensions] = React144.useState(null);
const [showStartingStyleAttribute, setShowStartingStyleAttribute] = React144.useState(false);
useIsoLayoutEffect(() => {
store.set("adaptiveOrigin", adaptiveOrigin);
return () => {
store.set("adaptiveOrigin", void 0);
};
}, [store]);
const handleMeasureLayout = useStableCallback(() => {
currentContainerRef.current?.style.setProperty("animation", "none");
currentContainerRef.current?.style.setProperty("transition", "none");
previousContainerRef.current?.style.setProperty("display", "none");
});
const handleMeasureLayoutComplete = useStableCallback((previousDimensions) => {
currentContainerRef.current?.style.removeProperty("animation");
currentContainerRef.current?.style.removeProperty("transition");
previousContainerRef.current?.style.removeProperty("display");
if (previousDimensions) {
setPreviousContentDimensions(previousDimensions);
}
});
const armViewportCleanup = useStableCallback(() => {
cleanupControllerRef.current?.abort();
const controller = new AbortController();
cleanupControllerRef.current = controller;
onAnimationsFinished(() => {
setPreviousContentNode(null);
setPreviousContentDimensions(null);
capturedNodeRef.current = null;
}, controller.signal);
});
const lastHandledTriggerRef = React144.useRef(null);
useIsoLayoutEffect(() => {
if (!open7 || !mounted) {
lastHandledTriggerRef.current = null;
}
}, [open7, mounted]);
useIsoLayoutEffect(() => {
if (activeTrigger && previousActiveTrigger && activeTrigger !== previousActiveTrigger && lastHandledTriggerRef.current !== activeTrigger && capturedNodeRef.current) {
setPreviousContentNode(capturedNodeRef.current);
setShowStartingStyleAttribute(true);
const offset4 = calculateRelativePosition(previousActiveTrigger, activeTrigger);
setNewTriggerOffset(offset4);
lastHandledTriggerRef.current = activeTrigger;
}
}, [activeTrigger, previousActiveTrigger]);
useIsoLayoutEffect(() => {
if (previousContentNode == null) {
return;
}
cleanupControllerRef.current?.abort();
setShowStartingStyleAttribute(true);
cleanupFrame.request(() => {
ReactDOM8.flushSync(() => {
setShowStartingStyleAttribute(false);
});
armViewportCleanup();
});
}, [currentContentKey, previousContentNode, armViewportCleanup, cleanupFrame]);
useIsoLayoutEffect(() => {
const source = currentContainerRef.current;
if (!source) {
return;
}
const wrapper = ownerDocument(source).createElement("div");
for (const child of Array.from(source.childNodes)) {
wrapper.appendChild(child.cloneNode(true));
}
capturedNodeRef.current = wrapper;
});
const isTransitioning = previousContentNode != null;
let childrenToRender;
if (!isTransitioning) {
childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", {
"data-current": true,
ref: currentContainerRef,
children
}, currentContentKey);
} else {
childrenToRender = /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(React144.Fragment, {
children: [/* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", {
"data-previous": true,
inert: inertValue(true),
ref: previousContainerRef,
style: {
...previousContentDimensions ? {
[popupWidth]: `${previousContentDimensions.width}px`,
[popupHeight]: `${previousContentDimensions.height}px`
} : null,
position: "absolute"
},
"data-ending-style": showStartingStyleAttribute ? void 0 : ""
}, "previous"), /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", {
"data-current": true,
ref: currentContainerRef,
"data-starting-style": showStartingStyleAttribute ? "" : void 0,
children
}, currentContentKey)]
});
}
useIsoLayoutEffect(() => {
const container = previousContainerRef.current;
if (!container || !previousContentNode) {
return;
}
container.replaceChildren(...Array.from(previousContentNode.childNodes));
}, [previousContentNode]);
usePopupAutoResize({
popupElement,
positionerElement,
mounted,
content: payload,
onMeasureLayout: handleMeasureLayout,
onMeasureLayoutComplete: handleMeasureLayoutComplete,
side: side2,
direction
});
const state = {
activationDirection: getActivationDirection(newTriggerOffset),
transitioning: isTransitioning
};
return {
children: childrenToRender,
state
};
}
function getActivationDirection(offset4) {
if (!offset4) {
return void 0;
}
return `${getValueWithTolerance(offset4.horizontal, 5, "right", "left")} ${getValueWithTolerance(offset4.vertical, 5, "down", "up")}`;
}
function getValueWithTolerance(value, tolerance, positiveLabel, negativeLabel) {
if (value > tolerance) {
return positiveLabel;
}
if (value < -tolerance) {
return negativeLabel;
}
return "";
}
function calculateRelativePosition(from, to) {
const fromRect = from.getBoundingClientRect();
const toRect = to.getBoundingClientRect();
const fromCenter = {
x: fromRect.left + fromRect.width / 2,
y: fromRect.top + fromRect.height / 2
};
const toCenter = {
x: toRect.left + toRect.width / 2,
y: toRect.top + toRect.height / 2
};
return {
horizontal: toCenter.x - fromCenter.x,
vertical: toCenter.y - fromCenter.y
};
}
function usePopupContentKey(activeTriggerId, payload) {
const [contentKey, setContentKey] = React144.useState(0);
const previousActiveTriggerIdRef = React144.useRef(activeTriggerId);
const previousPayloadRef = React144.useRef(payload);
const pendingPayloadUpdateRef = React144.useRef(false);
useIsoLayoutEffect(() => {
const previousActiveTriggerId = previousActiveTriggerIdRef.current;
const previousPayload = previousPayloadRef.current;
const triggerIdChanged = activeTriggerId !== previousActiveTriggerId;
const payloadChanged = payload !== previousPayload;
if (triggerIdChanged) {
setContentKey((value) => value + 1);
pendingPayloadUpdateRef.current = !payloadChanged;
} else if (pendingPayloadUpdateRef.current && payloadChanged) {
setContentKey((value) => value + 1);
pendingPayloadUpdateRef.current = false;
}
previousActiveTriggerIdRef.current = activeTriggerId;
previousPayloadRef.current = payload;
}, [activeTriggerId, payload]);
return `${activeTriggerId ?? "current"}-${contentKey}`;
}
// node_modules/@base-ui/react/menu/viewport/MenuViewport.mjs
var MenuViewport = /* @__PURE__ */ React145.forwardRef(function MenuViewport2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
children,
...elementProps
} = componentProps;
const {
store
} = useMenuRootContext();
const {
side: side2
} = useMenuPositionerContext();
const instantType = store.useState("instantType");
const {
children: childrenToRender,
state: viewportState
} = usePopupViewport({
store,
side: side2,
children
});
const state = {
activationDirection: viewportState.activationDirection,
transitioning: viewportState.transitioning,
instant: instantType
};
return useRenderElement("div", componentProps, {
state,
ref: forwardedRef,
props: [elementProps, {
children: childrenToRender
}],
stateAttributesMapping: popupViewportStateMapping
});
});
if (true) MenuViewport.displayName = "MenuViewport";
// node_modules/@base-ui/react/separator/Separator.mjs
var React146 = __toESM(require_react(), 1);
var Separator = /* @__PURE__ */ React146.forwardRef(function SeparatorComponent(componentProps, forwardedRef) {
const {
className,
render: render4,
orientation = "horizontal",
style,
...elementProps
} = componentProps;
const state = {
orientation
};
const element = useRenderElement("div", componentProps, {
state,
ref: forwardedRef,
props: [{
role: "separator",
"aria-orientation": orientation
}, elementProps]
});
return element;
});
if (true) Separator.displayName = "Separator";
// node_modules/@base-ui/react/menu/submenu-trigger/MenuSubmenuTrigger.mjs
var React147 = __toESM(require_react(), 1);
// node_modules/@base-ui/utils/isElementDisabled.mjs
function isElementDisabled(element) {
return element == null || element.hasAttribute("disabled") || element.getAttribute("aria-disabled") === "true";
}
// node_modules/@base-ui/react/menu/submenu-trigger/MenuSubmenuTrigger.mjs
var VOICE_OVER_EXPANDED_PROPS = {
"aria-expanded": void 0
};
var MenuSubmenuTrigger = /* @__PURE__ */ React147.forwardRef(function MenuSubmenuTrigger2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
label,
id: idProp,
nativeButton = false,
openOnHover = true,
delay = 100,
closeDelay = 0,
disabled: disabledProp = false,
...elementProps
} = componentProps;
const submenuRootContext = useMenuSubmenuRootContext();
if (!submenuRootContext?.parentMenu) {
throw new Error(true ? "Base UI: must be placed in ." : formatErrorMessage_default(37));
}
const listItem = useCompositeListItem({
guess: true,
label
});
const menuPositionerContext = useMenuPositionerContext();
const {
store
} = useMenuRootContext();
const thisTriggerId = useBaseUiId(idProp);
const open7 = store.useState("open");
const floatingRootContext = store.useState("floatingRootContext");
const floatingTreeRoot = store.useState("floatingTreeRoot");
const popupId = store.useState("triggerPopupId", thisTriggerId);
const baseRegisterTrigger = useTriggerRegistration(thisTriggerId, store);
const registerTrigger = useStableCallback((element2) => {
baseRegisterTrigger(element2);
if (element2 !== null && store.select("open") && store.select("activeTriggerId") == null) {
store.update({
activeTriggerId: thisTriggerId ?? null,
activeTriggerElement: element2,
closeDelay
});
}
});
const triggerElementRef = React147.useRef(null);
const handleTriggerElementRef = React147.useCallback((el) => {
triggerElementRef.current = el;
store.set("activeTriggerElement", el);
}, [store]);
useIsoLayoutEffect(() => {
registerTrigger(triggerElementRef.current);
return () => registerTrigger(null);
}, [registerTrigger, thisTriggerId, store]);
store.useSyncedValue("closeDelay", closeDelay);
const parentMenuStore = submenuRootContext.parentMenu;
const rootDisabled = store.useState("disabled");
const parentDisabled = parentMenuStore.useState("disabled");
const disabled3 = disabledProp || rootDisabled || parentDisabled;
if (true) {
React147.useEffect(() => {
const element2 = triggerElementRef.current;
if (element2 && isElementDisabled(element2) && !disabled3) {
const ownerStackMessage = SafeReact.captureOwnerStack?.() || "";
warn(`A disabled element was detected on . To properly disable the trigger, use the \`disabled\` prop on the component instead of setting it on the rendered element.${ownerStackMessage}`);
}
});
}
const itemProps = parentMenuStore.useState("itemProps");
const highlighted = parentMenuStore.useState("isActive", listItem.index);
const itemMetadata = React147.useMemo(() => ({
type: "submenu-trigger",
setActive() {
if (parentMenuStore.select("highlightItemOnHover")) {
parentMenuStore.set("activeIndex", listItem.index);
}
}
}), [parentMenuStore, listItem.index]);
const {
getItemProps,
itemRef
} = useMenuItem({
closeOnClick: false,
disabled: disabled3,
highlighted,
id: thisTriggerId,
store,
typingRef: parentMenuStore.context.typingRef,
nativeButton,
itemMetadata,
nodeId: menuPositionerContext?.context.nodeId
});
const hoverEnabled = store.useState("hoverEnabled");
const hoverProps = useHoverReferenceInteraction(floatingRootContext, {
enabled: hoverEnabled && openOnHover && !disabled3,
handleClose: safePolygon({
blockPointerEvents: true
}),
mouseOnly: true,
move: true,
restMs: delay,
delay: {
open: delay,
close: closeDelay
},
shouldOpen: delay > 0 ? () => parentMenuStore.select("allowMouseEnter") : void 0,
triggerElementRef,
externalTree: floatingTreeRoot,
isClosing: () => store.select("transitionStatus") === "ending",
// Chrome can drop the trigger's `mouseleave` during a fast pointer sweep,
// leaving a stale submenu open (see #5152) — cancel from `mouseout` too.
guardStaleOpen: true
});
const click = useClick(floatingRootContext, {
enabled: !disabled3,
event: "mousedown",
toggle: !openOnHover,
ignoreMouse: openOnHover,
stickIfOpen: false
});
const localInteractionProps = click.reference ?? EMPTY_OBJECT;
const rootTriggerProps = store.useState("triggerProps", true);
delete rootTriggerProps.id;
const state = {
disabled: disabled3,
highlighted,
open: open7
};
const openMethod = store.useState("openMethod");
const lastOpenChangeReason = store.useState("lastOpenChangeReason");
const openedByKeyboard = lastOpenChangeReason === reason_parts_exports.listNavigation || openMethod === "keyboard";
const shouldOmitExpanded = open7 && openedByKeyboard && parts_exports.screenReader.voiceOver;
const element = useRenderElement("div", componentProps, {
state,
stateAttributesMapping: triggerOpenStateMapping2,
props: [
localInteractionProps,
hoverProps,
rootTriggerProps,
itemProps,
// Opening a submenu changes the trigger's expanded state while the trigger still holds
// focus, and VoiceOver announces that state change instead of the submenu item that focus
// moves to a moment later, so the first item is never announced. Dropping the state while
// the submenu is open avoids the announcement without claiming the submenu is collapsed;
// `aria-haspopup` still conveys that the item opens a submenu.
shouldOmitExpanded ? VOICE_OVER_EXPANDED_PROPS : void 0,
{
"aria-controls": popupId,
tabIndex: open7 || highlighted ? 0 : -1,
onBlur() {
if (highlighted) {
parentMenuStore.set("activeIndex", null);
}
}
},
elementProps,
getItemProps
],
ref: [forwardedRef, listItem.ref, itemRef, registerTrigger, handleTriggerElementRef]
});
return element;
});
if (true) MenuSubmenuTrigger.displayName = "MenuSubmenuTrigger";
// node_modules/@base-ui/react/menu/store/MenuHandle.mjs
var MenuHandle = class extends BasePopupHandle {
constructor() {
super(createNullMenuStore(), "Menu");
}
/**
* Opens the menu and associates it with the trigger with the given id.
*
* This method should only be called in an event handler or an effect (not during rendering).
*
* @param triggerId ID of the trigger to associate with the menu. The trigger must be a matching
* `Menu.Trigger` with this handle passed as a prop.
*/
open(triggerId) {
this.openByTrigger(triggerId);
}
/**
* Closes the menu.
*
* This method should only be called in an event handler or an effect (not during rendering).
*/
close() {
this.closePopup();
}
/**
* Whether the menu is currently open. Returns `false` while no root is attached to the handle.
*/
get isOpen() {
return this.attachedStore?.select("open") ?? false;
}
};
function createMenuHandle() {
return new MenuHandle();
}
// node_modules/@base-ui/react/dialog/index.parts.mjs
var index_parts_exports5 = {};
__export(index_parts_exports5, {
Backdrop: () => DialogBackdrop,
Close: () => DialogClose,
Description: () => DialogDescription,
Handle: () => DialogHandle,
Popup: () => DialogPopup,
Portal: () => DialogPortal,
Root: () => DialogRoot,
Title: () => DialogTitle,
Trigger: () => DialogTrigger,
Viewport: () => DialogViewport,
createHandle: () => createDialogHandle
});
// node_modules/@base-ui/react/dialog/root/DialogRoot.mjs
var DialogRoot = fastComponent(function DialogRoot2(props) {
return useRenderDialogRoot("dialog", props);
});
if (true) DialogRoot.displayName = "DialogRoot";
// node_modules/@base-ui/react/drawer/index.parts.mjs
var index_parts_exports6 = {};
__export(index_parts_exports6, {
Backdrop: () => DrawerBackdrop,
Close: () => DrawerClose,
Content: () => DrawerContent,
Description: () => DrawerDescription,
Handle: () => DrawerHandle,
Indent: () => DrawerIndent,
IndentBackground: () => DrawerIndentBackground,
Popup: () => DrawerPopup,
Portal: () => DrawerPortal,
Provider: () => DrawerProvider,
Root: () => DrawerRoot,
SwipeArea: () => DrawerSwipeArea,
Title: () => DrawerTitle,
Trigger: () => DrawerTrigger,
Viewport: () => DrawerViewport,
VirtualKeyboardProvider: () => DrawerVirtualKeyboardProvider,
createHandle: () => createDrawerHandle
});
// node_modules/@base-ui/react/drawer/backdrop/DrawerBackdrop.mjs
var React148 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/drawer/popup/DrawerPopupCssVars.mjs
var nestedDrawers = "--nested-drawers";
var height = "--drawer-height";
var frontmostHeight = "--drawer-frontmost-height";
var swipeMovementX = "--drawer-swipe-movement-x";
var swipeMovementY = "--drawer-swipe-movement-y";
var snapPointOffset = "--drawer-snap-point-offset";
var swipeStrength = "--drawer-swipe-strength";
// node_modules/@base-ui/react/drawer/backdrop/DrawerBackdropCssVars.mjs
var swipeProgress = "--drawer-swipe-progress";
// node_modules/@base-ui/react/drawer/backdrop/DrawerBackdrop.mjs
var DrawerBackdrop = /* @__PURE__ */ React148.forwardRef(function DrawerBackdrop2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
forceRender = false,
...elementProps
} = componentProps;
const store = useDialogRootContext();
const open7 = store.useState("open");
const nested = store.useState("nested");
const mounted = store.useState("mounted");
const transitionStatus = store.useState("transitionStatus");
const state = {
open: open7,
transitionStatus
};
return useRenderElement("div", componentProps, {
state,
ref: [store.context.backdropRef, forwardedRef],
stateAttributesMapping: popupTransitionStateMapping,
props: [{
role: "presentation",
hidden: !mounted,
style: {
pointerEvents: !open7 ? "none" : void 0,
userSelect: "none",
WebkitUserSelect: "none",
[swipeProgress]: "0",
[swipeStrength]: "1"
}
}, elementProps],
enabled: forceRender || !nested
});
});
if (true) DrawerBackdrop.displayName = "DrawerBackdrop";
// node_modules/@base-ui/react/drawer/close/DrawerClose.mjs
var DrawerClose = DialogClose;
// node_modules/@base-ui/react/drawer/content/DrawerContent.mjs
var React149 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/drawer/content/drawerContentAttribute.mjs
var DRAWER_CONTENT_ATTRIBUTE = "data-drawer-content";
// node_modules/@base-ui/react/drawer/content/DrawerContent.mjs
var DrawerContent = /* @__PURE__ */ React149.forwardRef(function DrawerContent2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
useDialogRootContext();
return useRenderElement("div", componentProps, {
ref: forwardedRef,
props: [{
[DRAWER_CONTENT_ATTRIBUTE]: ""
}, elementProps]
});
});
if (true) DrawerContent.displayName = "DrawerContent";
// node_modules/@base-ui/react/drawer/description/DrawerDescription.mjs
var DrawerDescription = DialogDescription;
// node_modules/@base-ui/react/drawer/indent/DrawerIndent.mjs
var React151 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/drawer/provider/DrawerProviderContext.mjs
var React150 = __toESM(require_react(), 1);
var DrawerProviderContext = /* @__PURE__ */ React150.createContext(void 0);
if (true) DrawerProviderContext.displayName = "DrawerProviderContext";
function useDrawerProviderContext() {
return React150.useContext(DrawerProviderContext);
}
// node_modules/@base-ui/react/drawer/indent/DrawerIndent.mjs
var stateAttributesMapping5 = {
active(value) {
if (value) {
return {
"data-active": ""
};
}
return {
"data-inactive": ""
};
}
};
var DrawerIndent = /* @__PURE__ */ React151.forwardRef(function DrawerIndent2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const providerContext = useDrawerProviderContext();
const active = providerContext?.active ?? false;
const visualStateStore = providerContext?.visualStateStore;
const indentRef = React151.useRef(null);
useIsoLayoutEffect(() => {
const element = indentRef.current;
if (!element || !visualStateStore) {
return void 0;
}
const syncVisualState = () => {
const {
swipeProgress: swipeProgress2,
frontmostHeight: frontmostHeight2
} = visualStateStore.getSnapshot();
if (swipeProgress2 <= 0) {
element.style.setProperty(swipeProgress, "0");
} else {
element.style.setProperty(swipeProgress, `${swipeProgress2}`);
}
if (frontmostHeight2 <= 0) {
element.style.removeProperty(height);
} else {
element.style.setProperty(height, `${frontmostHeight2}px`);
}
};
syncVisualState();
const unsubscribe = visualStateStore.subscribe(syncVisualState);
return () => {
unsubscribe();
element.style.setProperty(swipeProgress, "0");
element.style.removeProperty(height);
};
}, [visualStateStore]);
const state = {
active
};
return useRenderElement("div", componentProps, {
ref: [forwardedRef, indentRef],
state,
props: [{
style: {
[swipeProgress]: "0"
}
}, elementProps],
stateAttributesMapping: stateAttributesMapping5
});
});
if (true) DrawerIndent.displayName = "DrawerIndent";
// node_modules/@base-ui/react/drawer/indent-background/DrawerIndentBackground.mjs
var React152 = __toESM(require_react(), 1);
var stateAttributesMapping6 = {
active(value) {
if (value) {
return {
"data-active": ""
};
}
return {
"data-inactive": ""
};
}
};
var DrawerIndentBackground = /* @__PURE__ */ React152.forwardRef(function DrawerIndentBackground2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
...elementProps
} = componentProps;
const providerContext = useDrawerProviderContext();
const active = providerContext?.active ?? false;
const state = {
active
};
return useRenderElement("div", componentProps, {
ref: forwardedRef,
state,
props: elementProps,
stateAttributesMapping: stateAttributesMapping6
});
});
if (true) DrawerIndentBackground.displayName = "DrawerIndentBackground";
// node_modules/@base-ui/react/drawer/popup/DrawerPopup.mjs
var React156 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/drawer/popup/DrawerPopupDataAttributes.mjs
var open4 = CommonPopupDataAttributes_exports.open;
var closed4 = CommonPopupDataAttributes_exports.closed;
var startingStyle5 = CommonPopupDataAttributes_exports.startingStyle;
var endingStyle5 = CommonPopupDataAttributes_exports.endingStyle;
var expanded = "data-expanded";
var nestedDrawerOpen = "data-nested-drawer-open";
var nestedDrawerSwiping = "data-nested-drawer-swiping";
var swipeDismiss = "data-swipe-dismiss";
var swipeDirection = "data-swipe-direction";
var swiping = "data-swiping";
// node_modules/@base-ui/react/drawer/root/DrawerRootContext.mjs
var React153 = __toESM(require_react(), 1);
var DrawerRootContext = /* @__PURE__ */ React153.createContext(void 0);
if (true) DrawerRootContext.displayName = "DrawerRootContext";
function useDrawerRootContext(optional) {
const drawerRootContext = React153.useContext(DrawerRootContext);
if (optional !== true && drawerRootContext === void 0) {
throw new Error(true ? "Base UI: DrawerRootContext is missing. Drawer parts must be placed within ." : formatErrorMessage_default(90));
}
return drawerRootContext;
}
// node_modules/@base-ui/react/drawer/root/useDrawerSnapPoints.mjs
var React154 = __toESM(require_react(), 1);
// node_modules/@base-ui/utils/clamp.mjs
function clamp2(val, min3 = Number.MIN_SAFE_INTEGER, max3 = Number.MAX_SAFE_INTEGER) {
return Math.max(min3, Math.min(val, max3));
}
// node_modules/@base-ui/react/drawer/root/useDrawerSnapPoints.mjs
function getSnapPointSwipeMovement(baseOffset, movementValue) {
const nextOffset = baseOffset + movementValue;
if (nextOffset >= 0) {
return movementValue;
}
return -Math.sqrt(-nextOffset) - baseOffset;
}
function resolveSnapPointValue(snapPoint, viewportHeight, rootFontSize) {
if (!Number.isFinite(viewportHeight) || viewportHeight <= 0) {
return null;
}
if (typeof snapPoint === "number") {
if (!Number.isFinite(snapPoint)) {
return null;
}
if (snapPoint <= 1) {
return clamp2(snapPoint, 0, 1) * viewportHeight;
}
return snapPoint;
}
const trimmed = snapPoint.trim();
if (trimmed.endsWith("px")) {
const value = Number.parseFloat(trimmed);
return Number.isFinite(value) ? value : null;
}
if (trimmed.endsWith("rem")) {
const value = Number.parseFloat(trimmed);
return Number.isFinite(value) ? value * rootFontSize : null;
}
return null;
}
function closestSnapPointIndex(values, target) {
let closestIndex = -1;
let closestDistance = Infinity;
for (let index2 = 0; index2 < values.length; index2 += 1) {
const distance = Math.abs(values[index2] - target);
if (distance < closestDistance) {
closestDistance = distance;
closestIndex = index2;
}
}
return closestIndex;
}
function useDrawerSnapPoints() {
const store = useDialogRootContext();
const {
snapPoints,
activeSnapPoint,
setActiveSnapPoint,
popupHeight: popupHeight2
} = useDrawerRootContext();
const viewportElement = store.useState("viewportElement");
const [viewportHeight, setViewportHeight] = React154.useState(0);
const [rootFontSize, setRootFontSize] = React154.useState(16);
const measureViewportHeight = useStableCallback(() => {
const doc = ownerDocument(viewportElement);
const html = doc.documentElement;
setViewportHeight(viewportElement ? viewportElement.offsetHeight : html.clientHeight);
const fontSize = parseFloat(getComputedStyle(html).fontSize);
if (Number.isFinite(fontSize)) {
setRootFontSize(fontSize);
}
});
useIsoLayoutEffect(() => {
measureViewportHeight();
if (!viewportElement || typeof ResizeObserver !== "function") {
return void 0;
}
const resizeObserver = new ResizeObserver(measureViewportHeight);
resizeObserver.observe(viewportElement);
return () => {
resizeObserver.disconnect();
};
}, [measureViewportHeight, viewportElement]);
const resolvedSnapPoints = React154.useMemo(() => {
if (!snapPoints || snapPoints.length === 0 || viewportHeight <= 0 || popupHeight2 <= 0) {
return [];
}
const maxHeight = Math.min(popupHeight2, viewportHeight);
const resolved = snapPoints.map((value) => {
const resolvedHeight = resolveSnapPointValue(value, viewportHeight, rootFontSize);
if (resolvedHeight === null) {
return null;
}
const clampedHeight = clamp2(resolvedHeight, 0, maxHeight);
return {
value,
height: clampedHeight,
offset: Math.max(0, popupHeight2 - clampedHeight)
};
}).filter((point) => Boolean(point));
if (resolved.length <= 1) {
return resolved;
}
const deduped = [];
const seenHeights = [];
for (let index2 = resolved.length - 1; index2 >= 0; index2 -= 1) {
const point = resolved[index2];
const isDuplicate = seenHeights.some((height2) => Math.abs(height2 - point.height) <= 1);
if (isDuplicate) {
continue;
}
seenHeights.push(point.height);
deduped.push(point);
}
deduped.reverse();
return deduped;
}, [popupHeight2, rootFontSize, snapPoints, viewportHeight]);
const resolvedActiveSnapPoint = React154.useMemo(() => {
if (activeSnapPoint === null) {
return void 0;
}
const exactMatch = resolvedSnapPoints.find((point) => Object.is(point.value, activeSnapPoint));
if (exactMatch) {
return exactMatch;
}
const maxHeight = Math.min(popupHeight2, viewportHeight);
const resolvedHeight = resolveSnapPointValue(activeSnapPoint, viewportHeight, rootFontSize);
if (resolvedHeight === null) {
return void 0;
}
const clampedHeight = clamp2(resolvedHeight, 0, maxHeight);
return resolvedSnapPoints[closestSnapPointIndex(resolvedSnapPoints.map((point) => point.height), clampedHeight)];
}, [activeSnapPoint, popupHeight2, resolvedSnapPoints, rootFontSize, viewportHeight]);
return {
snapPoints,
activeSnapPoint,
setActiveSnapPoint,
popupHeight: popupHeight2,
viewportHeight,
resolvedSnapPoints,
activeSnapPointOffset: resolvedActiveSnapPoint?.offset ?? null
};
}
// node_modules/@base-ui/react/drawer/viewport/DrawerViewportContext.mjs
var React155 = __toESM(require_react(), 1);
var DrawerViewportContext = /* @__PURE__ */ React155.createContext(null);
if (true) DrawerViewportContext.displayName = "DrawerViewportContext";
function useDrawerViewportContext() {
return React155.useContext(DrawerViewportContext);
}
// node_modules/@base-ui/react/drawer/popup/DrawerPopup.mjs
var import_jsx_runtime39 = __toESM(require_jsx_runtime(), 1);
var drawerSwipeVarsRegistered = false;
function removeCSSVariableInheritance() {
if (drawerSwipeVarsRegistered) {
return;
}
if (typeof CSS !== "undefined" && "registerProperty" in CSS) {
[swipeMovementX, swipeMovementY, snapPointOffset].forEach((name) => {
try {
CSS.registerProperty({
name,
syntax: "",
inherits: false,
initialValue: "0px"
});
} catch {
}
});
[{
name: swipeProgress,
initialValue: "0"
}, {
name: swipeStrength,
initialValue: "1"
}].forEach(({
name,
initialValue
}) => {
try {
CSS.registerProperty({
name,
syntax: "",
inherits: false,
initialValue
});
} catch {
}
});
}
drawerSwipeVarsRegistered = true;
}
var stateAttributesMapping7 = {
...popupTransitionStateMapping,
expanded(value) {
return value ? {
[expanded]: ""
} : null;
},
nestedDrawerOpen(value) {
return value ? {
[nestedDrawerOpen]: ""
} : null;
},
nestedDrawerSwiping(value) {
return value ? {
[nestedDrawerSwiping]: ""
} : null;
},
swipeDirection(value) {
return {
[swipeDirection]: value
};
},
swiping(value) {
return value ? {
[swiping]: ""
} : null;
}
};
var DrawerPopup = /* @__PURE__ */ React156.forwardRef(function DrawerPopup2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
finalFocus,
initialFocus,
...elementProps
} = componentProps;
const store = useDialogRootContext();
const popupRef = store.context.popupRef;
const {
swipeDirection: swipeDirection3,
frontmostHeight: frontmostHeight2,
hasNestedDrawer,
nestedSwiping,
nestedSwipeProgressStore,
onPopupHeightChange,
notifyParentFrontmostHeight,
notifyParentHasNestedDrawer
} = useDrawerRootContext();
const descriptionElementId = store.useState("descriptionElementId");
const disablePointerDismissal = store.useState("disablePointerDismissal");
const floatingRootContext = store.useState("floatingRootContext");
const rootPopupProps = store.useState("popupProps");
const modal = store.useState("modal");
const mounted = store.useState("mounted");
const nested = store.useState("nested");
const nestedOpenDrawerCount = store.useState("nestedOpenDrawerCount");
const transitionStatus = store.useState("transitionStatus");
const open7 = store.useState("open");
const openMethod = store.useState("openMethod");
const titleElementId = store.useState("titleElementId");
const role = store.useState("role");
const floatingId = floatingRootContext.useState("floatingId");
const popupId = elementProps.id ?? floatingId;
const swipe2 = useDrawerViewportContext();
useDialogPortalContext();
const {
snapPoints,
activeSnapPoint,
activeSnapPointOffset
} = useDrawerSnapPoints();
const nestedDrawerOpen2 = nestedOpenDrawerCount > 0;
const swiping3 = swipe2?.swiping ?? false;
const swipeStrength2 = swipe2?.swipeStrength ?? null;
const [popupHeight2, setPopupHeight] = React156.useState(0);
const popupHeightRef = React156.useRef(0);
if (true) {
React156.useEffect(() => {
if (swipe2) {
return;
}
const ownerStackMessage = SafeReact.captureOwnerStack?.() || "";
const message2 = " expected to be rendered within . Omitting the viewport disables drawer swipe handling and touch scroll locking. Wrap in .";
error(`${message2}${ownerStackMessage}`);
}, [swipe2]);
}
const measureHeight = useStableCallback(() => {
const popupElement = popupRef.current;
if (!popupElement) {
return;
}
const offsetHeight = popupElement.offsetHeight;
if (popupHeightRef.current > 0 && frontmostHeight2 > popupHeightRef.current && offsetHeight > popupHeightRef.current) {
return;
}
const keepHeightWhileNested = popupHeightRef.current > 0 && hasNestedDrawer;
if (keepHeightWhileNested) {
const oldHeight = popupHeightRef.current;
setPopupHeight(oldHeight);
onPopupHeightChange(oldHeight);
return;
}
const nextHeight = offsetHeight;
if (nextHeight === popupHeightRef.current) {
return;
}
popupHeightRef.current = nextHeight;
setPopupHeight(nextHeight);
onPopupHeightChange(nextHeight);
});
useIsoLayoutEffect(() => {
if (!mounted) {
popupHeightRef.current = 0;
setPopupHeight(0);
onPopupHeightChange(0);
return void 0;
}
const popupElement = popupRef.current;
if (!popupElement) {
return void 0;
}
removeCSSVariableInheritance();
measureHeight();
if (typeof ResizeObserver !== "function") {
return void 0;
}
const resizeObserver = new ResizeObserver(measureHeight);
resizeObserver.observe(popupElement);
return () => {
resizeObserver.disconnect();
};
}, [measureHeight, mounted, nestedDrawerOpen2, onPopupHeightChange, popupRef]);
useIsoLayoutEffect(() => {
const syncNestedSwipeProgress = () => {
const popupElement2 = popupRef.current;
if (!popupElement2) {
return;
}
const progress = nestedSwipeProgressStore.getSnapshot();
if (progress > 0) {
popupElement2.style.setProperty(swipeProgress, `${progress}`);
} else {
popupElement2.style.setProperty(swipeProgress, "0");
}
};
syncNestedSwipeProgress();
const unsubscribe = nestedSwipeProgressStore.subscribe(syncNestedSwipeProgress);
const popupElement = popupRef.current;
return () => {
unsubscribe();
if (popupElement) {
popupElement.style.setProperty(swipeProgress, "0");
}
};
}, [nestedSwipeProgressStore, popupRef]);
useIsoLayoutEffect(() => {
if (!open7) {
return void 0;
}
notifyParentFrontmostHeight?.(frontmostHeight2);
return () => {
notifyParentFrontmostHeight?.(0);
};
}, [frontmostHeight2, open7, notifyParentFrontmostHeight]);
useIsoLayoutEffect(() => {
if (!notifyParentHasNestedDrawer) {
return void 0;
}
const present = open7 || transitionStatus === "ending";
notifyParentHasNestedDrawer(present);
return () => {
notifyParentHasNestedDrawer(false);
};
}, [notifyParentHasNestedDrawer, open7, transitionStatus]);
useOpenChangeComplete({
open: open7,
ref: popupRef,
onComplete() {
if (open7) {
store.context.onOpenChangeComplete?.(true);
}
}
});
const resolvedInitialFocus = initialFocus === void 0 ? popupRef : initialFocus;
const setPopupElement = store.useStateSetter("popupElement");
const state = {
open: open7,
nested,
transitionStatus,
expanded: activeSnapPoint === 1,
nestedDrawerOpen: nestedDrawerOpen2,
nestedDrawerSwiping: nestedSwiping,
swipeDirection: swipeDirection3,
swiping: swiping3
};
let popupHeightCssVarValue;
const shouldUseAutoHeight = !hasNestedDrawer && transitionStatus !== "ending";
if (popupHeight2 && !shouldUseAutoHeight) {
popupHeightCssVarValue = `${popupHeight2}px`;
}
const shouldApplySnapPoints = snapPoints && snapPoints.length > 0 && (swipeDirection3 === "down" || swipeDirection3 === "up");
let snapPointOffsetValue = null;
if (shouldApplySnapPoints && activeSnapPointOffset !== null) {
snapPointOffsetValue = swipeDirection3 === "up" ? -activeSnapPointOffset : activeSnapPointOffset;
}
let dragStyles = swipe2 ? swipe2.getDragStyles() : EMPTY_OBJECT;
if (shouldApplySnapPoints && swipeDirection3 === "down") {
const baseOffset = activeSnapPointOffset ?? 0;
const movementValue = Number.parseFloat(String(dragStyles[swipeMovementY]));
if (swiping3 && Number.isFinite(movementValue)) {
dragStyles = {
...dragStyles,
transform: void 0,
[swipeMovementY]: `${getSnapPointSwipeMovement(baseOffset, movementValue)}px`
};
} else {
dragStyles = {
...dragStyles,
transform: void 0
};
}
}
const element = useRenderElement("div", componentProps, {
state,
props: [rootPopupProps, {
id: popupId,
"aria-labelledby": titleElementId,
"aria-describedby": descriptionElementId,
role,
...FOCUSABLE_POPUP_PROPS,
hidden: !mounted,
onKeyDown(event) {
if (COMPOSITE_KEYS.has(event.key)) {
event.stopPropagation();
}
},
style: {
...dragStyles,
[swipeProgress]: "0",
[nestedDrawers]: nestedOpenDrawerCount,
[height]: popupHeightCssVarValue,
[snapPointOffset]: typeof snapPointOffsetValue === "number" ? `${snapPointOffsetValue}px` : "0px",
[frontmostHeight]: frontmostHeight2 ? `${frontmostHeight2}px` : void 0,
[swipeStrength]: typeof swipeStrength2 === "number" && Number.isFinite(swipeStrength2) && swipeStrength2 > 0 ? `${swipeStrength2}` : "1"
}
}, elementProps],
ref: [forwardedRef, popupRef, setPopupElement],
stateAttributesMapping: stateAttributesMapping7
});
return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(FloatingFocusManager, {
context: floatingRootContext,
openInteractionType: openMethod,
disabled: !mounted,
closeOnFocusOut: !disablePointerDismissal,
initialFocus: resolvedInitialFocus,
returnFocus: finalFocus,
modal: modal !== false,
restoreFocus: "popup",
children: element
});
});
if (true) DrawerPopup.displayName = "DrawerPopup";
// node_modules/@base-ui/react/drawer/portal/DrawerPortal.mjs
var DrawerPortal = DialogPortal;
// node_modules/@base-ui/react/drawer/provider/DrawerProvider.mjs
var React157 = __toESM(require_react(), 1);
var import_jsx_runtime40 = __toESM(require_jsx_runtime(), 1);
function DrawerProvider(props) {
const {
children
} = props;
const [openDrawers, setOpenDrawers] = React157.useState(() => /* @__PURE__ */ new Set());
const [visualStateStore] = React157.useState(createVisualStateStore);
const setDrawerOpen = useStableCallback((drawer, open7) => {
setOpenDrawers((prev) => {
if (prev.has(drawer) === open7) {
return prev;
}
const next = new Set(prev);
if (open7) {
next.add(drawer);
} else {
next.delete(drawer);
}
return next;
});
});
const removeDrawer = useStableCallback((drawer) => {
setDrawerOpen(drawer, false);
});
const active = openDrawers.size > 0;
const contextValue = React157.useMemo(() => ({
setDrawerOpen,
removeDrawer,
active,
visualStateStore
}), [active, removeDrawer, setDrawerOpen, visualStateStore]);
return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(DrawerProviderContext.Provider, {
value: contextValue,
children
});
}
function createVisualStateStore() {
let state = {
swipeProgress: 0,
frontmostHeight: 0
};
const listeners = /* @__PURE__ */ new Set();
return {
getSnapshot: () => state,
set(nextState) {
let nextSwipeProgress = state.swipeProgress;
if (nextState.swipeProgress !== void 0) {
nextSwipeProgress = Number.isFinite(nextState.swipeProgress) ? nextState.swipeProgress : 0;
}
let nextFrontmostHeight = state.frontmostHeight;
if (nextState.frontmostHeight !== void 0) {
nextFrontmostHeight = Number.isFinite(nextState.frontmostHeight) ? nextState.frontmostHeight : 0;
}
if (nextSwipeProgress === state.swipeProgress && nextFrontmostHeight === state.frontmostHeight) {
return;
}
state = {
swipeProgress: nextSwipeProgress,
frontmostHeight: nextFrontmostHeight
};
listeners.forEach((listener) => {
listener();
});
},
subscribe(listener) {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
}
};
}
// node_modules/@base-ui/react/drawer/root/DrawerRoot.mjs
var React158 = __toESM(require_react(), 1);
var import_jsx_runtime41 = __toESM(require_jsx_runtime(), 1);
var _DrawerProviderReport;
var _DrawerProviderReport2;
function DrawerRoot(props) {
const {
children,
open: openProp,
defaultOpen = false,
onOpenChange,
onOpenChangeComplete,
disablePointerDismissal = false,
modal = true,
actionsRef,
handle,
triggerId: triggerIdProp,
defaultTriggerId: defaultTriggerIdProp = null,
swipeDirection: swipeDirection3 = "down",
snapToSequentialPoints = false,
snapPoints,
snapPoint: snapPointProp,
defaultSnapPoint,
onSnapPointChange
} = props;
const parentDrawerRootContext = useDrawerRootContext(true);
const notifyParentSwipeProgressChange = parentDrawerRootContext?.onNestedSwipeProgressChange;
const notifyParentFrontmostHeight = parentDrawerRootContext?.onNestedFrontmostHeightChange;
const notifyParentSwipingChange = parentDrawerRootContext?.onNestedSwipingChange;
const notifyParentHasNestedDrawer = parentDrawerRootContext?.onNestedDrawerPresenceChange;
const [popupHeight2, setPopupHeight] = React158.useState(0);
const [frontmostHeight2, setFrontmostHeight] = React158.useState(0);
const [hasNestedDrawer, setHasNestedDrawer] = React158.useState(false);
const [nestedSwiping, setNestedSwiping] = React158.useState(false);
const [nestedSwipeProgressStore] = React158.useState(createNestedSwipeProgressStore);
const resolvedDefaultSnapPoint = defaultSnapPoint !== void 0 ? defaultSnapPoint : snapPoints?.[0] ?? null;
const isSnapPointControlled = snapPointProp !== void 0;
const [activeSnapPoint, setActiveSnapPointUnwrapped] = useControlled({
controlled: snapPointProp,
default: resolvedDefaultSnapPoint,
name: "Drawer",
state: "snapPoint"
});
const isNestedDrawerOpenRef = React158.useRef(false);
const swipeAreaActiveRef = React158.useRef(false);
const setActiveSnapPoint = useStableCallback((nextSnapPoint, eventDetails) => {
const resolvedEventDetails = eventDetails ?? createChangeEventDetails(reason_parts_exports.none);
onSnapPointChange?.(nextSnapPoint, resolvedEventDetails);
if (resolvedEventDetails.isCanceled) {
return;
}
setActiveSnapPointUnwrapped(nextSnapPoint);
});
const resolvedActiveSnapPoint = React158.useMemo(() => {
if (isSnapPointControlled) {
return activeSnapPoint;
}
if (!snapPoints || snapPoints.length === 0) {
return activeSnapPoint;
}
if (activeSnapPoint === null || !snapPoints.some((snapPoint) => Object.is(snapPoint, activeSnapPoint))) {
return resolvedDefaultSnapPoint;
}
return activeSnapPoint;
}, [activeSnapPoint, isSnapPointControlled, resolvedDefaultSnapPoint, snapPoints]);
const onPopupHeightChange = useStableCallback((height2) => {
setPopupHeight(height2);
if (!isNestedDrawerOpenRef.current && height2 > 0) {
setFrontmostHeight(height2);
}
});
const onNestedFrontmostHeightChange = useStableCallback((height2) => {
if (height2 > 0) {
isNestedDrawerOpenRef.current = true;
setFrontmostHeight(height2);
return;
}
isNestedDrawerOpenRef.current = false;
if (popupHeight2 > 0) {
setFrontmostHeight(popupHeight2);
}
});
const onNestedDrawerPresenceChange = useStableCallback((present) => {
setHasNestedDrawer(present);
});
const onNestedSwipeProgressChange = useStableCallback((progress) => {
nestedSwipeProgressStore.set(progress);
notifyParentSwipeProgressChange?.(progress);
});
const onNestedSwipingChange = useStableCallback((swiping3) => {
setNestedSwiping(swiping3);
notifyParentSwipingChange?.(swiping3);
});
const handleOpenChange = useStableCallback((nextOpen, eventDetails) => {
onOpenChange?.(nextOpen, eventDetails);
if (eventDetails.isCanceled) {
return;
}
if (!nextOpen && snapPoints && snapPoints.length > 0) {
setActiveSnapPoint(resolvedDefaultSnapPoint, createChangeEventDetails(eventDetails.reason, eventDetails.event, eventDetails.trigger));
}
});
const contextValue = React158.useMemo(() => ({
swipeDirection: swipeDirection3,
swipeAreaActiveRef,
snapToSequentialPoints,
snapPoints,
activeSnapPoint: resolvedActiveSnapPoint,
setActiveSnapPoint,
frontmostHeight: frontmostHeight2,
popupHeight: popupHeight2,
hasNestedDrawer,
nestedSwiping,
nestedSwipeProgressStore,
onNestedDrawerPresenceChange,
onPopupHeightChange,
onNestedFrontmostHeightChange,
onNestedSwipingChange,
onNestedSwipeProgressChange,
notifyParentFrontmostHeight,
notifyParentSwipingChange,
notifyParentSwipeProgressChange,
notifyParentHasNestedDrawer
}), [resolvedActiveSnapPoint, frontmostHeight2, hasNestedDrawer, nestedSwiping, nestedSwipeProgressStore, notifyParentHasNestedDrawer, notifyParentSwipeProgressChange, notifyParentSwipingChange, notifyParentFrontmostHeight, onNestedDrawerPresenceChange, onNestedFrontmostHeightChange, onNestedSwipeProgressChange, onNestedSwipingChange, onPopupHeightChange, popupHeight2, setActiveSnapPoint, snapPoints, snapToSequentialPoints, swipeAreaActiveRef, swipeDirection3]);
const resolvedChildren = typeof children === "function" ? (payload) => /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(React158.Fragment, {
children: [_DrawerProviderReport || (_DrawerProviderReport = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(DrawerProviderReporter, {})), children(payload)]
}) : /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(React158.Fragment, {
children: [_DrawerProviderReport2 || (_DrawerProviderReport2 = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(DrawerProviderReporter, {})), children]
});
const dialog = useRenderDialogRoot("drawer", {
open: openProp,
defaultOpen,
onOpenChange: handleOpenChange,
onOpenChangeComplete,
disablePointerDismissal,
modal,
actionsRef,
handle,
triggerId: triggerIdProp,
defaultTriggerId: defaultTriggerIdProp,
children: resolvedChildren
});
return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(DrawerRootContext.Provider, {
value: contextValue,
children: dialog
});
}
function createNestedSwipeProgressStore() {
let progress = 0;
const listeners = /* @__PURE__ */ new Set();
return {
getSnapshot: () => progress,
set(nextProgress) {
const resolved = Number.isFinite(nextProgress) ? nextProgress : 0;
if (resolved === progress) {
return;
}
progress = resolved;
listeners.forEach((listener) => {
listener();
});
},
subscribe(listener) {
listeners.add(listener);
return () => {
listeners.delete(listener);
};
}
};
}
function DrawerProviderReporter() {
const providerContext = useDrawerProviderContext();
const store = useDialogRootContext(false);
const setDrawerOpen = providerContext?.setDrawerOpen;
const removeDrawer = providerContext?.removeDrawer;
const open7 = store.useState("open");
const nestedOpenDialogCount = store.useState("nestedOpenDialogCount");
const popupElement = store.useState("popupElement");
const isTopmost = nestedOpenDialogCount === 0;
useIsoLayoutEffect(() => {
if (!removeDrawer) {
return void 0;
}
return () => {
removeDrawer(store);
};
}, [removeDrawer, store]);
useIsoLayoutEffect(() => {
setDrawerOpen?.(store, open7);
}, [open7, setDrawerOpen, store]);
React158.useEffect(() => {
if (!open7 || !isTopmost || !parts_exports.os.android) {
return void 0;
}
const win = getWindow(popupElement);
const CloseWatcherCtor = win.CloseWatcher;
if (!CloseWatcherCtor) {
return void 0;
}
function handleCloseWatcher(event) {
if (!store.select("open")) {
return;
}
store.setOpen(false, createChangeEventDetails(reason_parts_exports.closeWatcher, event));
}
const closeWatcher2 = new CloseWatcherCtor();
const unsubscribe = addEventListener(closeWatcher2, "close", handleCloseWatcher);
return () => {
unsubscribe();
closeWatcher2.destroy();
};
}, [store, isTopmost, open7, popupElement]);
return null;
}
// node_modules/@base-ui/react/drawer/swipe-area/DrawerSwipeArea.mjs
var React160 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/utils/useSwipeDismiss.mjs
var React159 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/utils/getElementAtPoint.mjs
function getElementAtPoint(root, x2, y2) {
return typeof root?.elementFromPoint === "function" ? root.elementFromPoint(x2, y2) : null;
}
// node_modules/@base-ui/react/utils/getElementTransform.mjs
function getElementTransform(element, computedStyle) {
const transform = (computedStyle ?? getWindow(element).getComputedStyle(element)).transform;
let translateX = 0;
let translateY = 0;
let scale = 1;
if (transform && transform !== "none") {
const matrix = transform.match(/matrix(?:3d)?\(([^)]+)\)/);
if (matrix) {
const values = matrix[1].split(", ").map(parseFloat);
if (values.length === 6) {
translateX = values[4];
translateY = values[5];
scale = Math.sqrt(values[0] * values[0] + values[1] * values[1]);
} else if (values.length === 16) {
translateX = values[12];
translateY = values[13];
scale = values[0];
}
}
}
return {
x: translateX,
y: translateY,
scale
};
}
// node_modules/@base-ui/react/utils/useSwipeDismiss.mjs
var DEFAULT_SWIPE_THRESHOLD = 40;
var REVERSE_CANCEL_THRESHOLD = 10;
var MIN_DRAG_THRESHOLD = 1;
var MIN_VELOCITY_DURATION_MS = 50;
var MIN_RELEASE_VELOCITY_DURATION_MS = 16;
var MAX_RELEASE_VELOCITY_AGE_MS = 80;
var DEFAULT_IGNORE_SELECTOR = 'button,a,input,select,textarea,label,[role="button"]';
function getDisplacement(direction, deltaX, deltaY) {
switch (direction) {
case "up":
return -deltaY;
case "down":
return deltaY;
case "left":
return -deltaX;
case "right":
return deltaX;
default:
return 0;
}
}
function getValidTimeStamp(timeStamp) {
return Number.isFinite(timeStamp) && timeStamp > 0 ? timeStamp : null;
}
function getDragTransform(dragOffset, scale) {
return `translate3d(${dragOffset.x}px,${dragOffset.y}px,0) scale(${scale})`;
}
function hasPrimaryMouseButton(buttons) {
return buttons % 2 === 1;
}
function safelyChangePointerCapture(element, pointerId, method) {
const pointerCaptureMethod = element[method];
if (typeof pointerCaptureMethod !== "function") {
return;
}
try {
pointerCaptureMethod.call(element, pointerId);
} catch (error2) {
if (error2 && typeof error2 === "object" && "name" in error2 && error2.name === "NotFoundError") {
return;
}
throw error2;
}
}
function useSwipeDismiss(options) {
const {
enabled,
directions: directions2,
elementRef,
movementCssVars,
canStart,
ignoreSelectorWhenTouch = true,
ignoreScrollableAncestors = false,
swipeThreshold: swipeThresholdProp,
onDismiss,
onProgress,
onCancel,
onSwipeStart,
onRelease,
onSwipingChange,
trackDrag = true
} = options;
const ignoreSelector = DEFAULT_IGNORE_SELECTOR;
const primaryDirection = directions2.length === 1 ? directions2[0] : void 0;
const swipeThresholdDefault = Math.max(0, typeof swipeThresholdProp === "number" ? swipeThresholdProp : DEFAULT_SWIPE_THRESHOLD);
const allowLeft = directions2.includes("left");
const allowRight = directions2.includes("right");
const allowUp = directions2.includes("up");
const allowDown = directions2.includes("down");
const hasHorizontal = allowLeft || allowRight;
const hasVertical = allowUp || allowDown;
const scrollAxes = React159.useMemo(() => {
const axes = [];
if (hasVertical) {
axes.push("vertical");
}
if (hasHorizontal) {
axes.push("horizontal");
}
return axes;
}, [hasHorizontal, hasVertical]);
const [currentSwipeDirection, setCurrentSwipeDirection] = React159.useState(void 0);
const [isSwiping, setIsSwiping] = React159.useState(false);
const [dragDismissed, setDragDismissed] = React159.useState(false);
const dragStartPosRef = React159.useRef({
x: 0,
y: 0
});
const dragOffsetRef = React159.useRef({
x: 0,
y: 0
});
const lastMovePosRef = React159.useRef(null);
const initialTransformRef = React159.useRef({
x: 0,
y: 0,
scale: 1
});
const intendedSwipeDirectionRef = React159.useRef(void 0);
const maxSwipeDisplacementRef = React159.useRef(0);
const cancelledSwipeRef = React159.useRef(false);
const swipeCancelBaselineRef = React159.useRef({
x: 0,
y: 0
});
const lockedDirectionRef = React159.useRef(null);
const isFirstPointerMoveRef = React159.useRef(false);
const pendingSwipeRef = React159.useRef(false);
const pendingSwipeStartPosRef = React159.useRef(null);
const swipeFromScrollableRef = React159.useRef(false);
const sawPrimaryButtonsOnMoveRef = React159.useRef(false);
const elementSizeRef = React159.useRef({
width: 0,
height: 0
});
const swipeProgressRef = React159.useRef(0);
const swipeThresholdRef = React159.useRef(swipeThresholdDefault);
const swipeThresholdFunctionRef = React159.useRef(null);
const swipeStartTimeRef = React159.useRef(null);
const lastDragSampleRef = React159.useRef(null);
const lastDragVelocityRef = React159.useRef({
x: 0,
y: 0
});
const lastProgressDetailsRef = React159.useRef(null);
const isSwipingRef = React159.useRef(false);
const dragStyleSnapshotRef = React159.useRef(null);
const setSwiping = useStableCallback((nextSwiping) => {
if (isSwipingRef.current === nextSwiping) {
return;
}
isSwipingRef.current = nextSwiping;
setIsSwiping(nextSwiping);
onSwipingChange?.(nextSwiping);
});
function resolveSwipeThreshold(direction) {
if (!direction) {
return;
}
const element = elementRef.current;
const thresholdFunction = swipeThresholdFunctionRef.current;
if (!element || !thresholdFunction) {
return;
}
const value = thresholdFunction({
element,
direction
});
swipeThresholdRef.current = Math.max(0, value);
}
const updateSwipeProgress = useStableCallback((progress, details) => {
const nextProgress = Number.isFinite(progress) ? clamp2(progress, 0, 1) : 0;
const progressChanged = nextProgress !== swipeProgressRef.current;
let detailsChanged = false;
if (details) {
const lastDetails = lastProgressDetailsRef.current;
detailsChanged = !lastDetails || lastDetails.deltaX !== details.deltaX || lastDetails.deltaY !== details.deltaY || lastDetails.direction !== details.direction;
}
if (!progressChanged && !detailsChanged) {
return;
}
swipeProgressRef.current = nextProgress;
if (details) {
lastProgressDetailsRef.current = details;
} else if (progressChanged) {
lastProgressDetailsRef.current = null;
}
onProgress?.(nextProgress, details);
});
const syncDragStyles = useStableCallback((swiping3) => {
const element = elementRef.current;
if (!trackDrag || !element) {
if (!swiping3) {
dragStyleSnapshotRef.current = null;
}
return;
}
const style = element.style;
const dragStyleSnapshot = dragStyleSnapshotRef.current;
if (swiping3) {
if (!dragStyleSnapshot) {
dragStyleSnapshotRef.current = [style.transition, style.transform];
}
style.transition = "none";
} else if (dragStyleSnapshot) {
[style.transition, style.transform] = dragStyleSnapshot;
dragStyleSnapshotRef.current = null;
}
const dragOffset = dragOffsetRef.current;
const initialTransform = initialTransformRef.current;
const deltaX = dragOffset.x - initialTransform.x;
const deltaY = dragOffset.y - initialTransform.y;
if (swiping3) {
style.transform = getDragTransform(dragOffset, initialTransform.scale);
}
style.setProperty(movementCssVars.x, `${deltaX}px`);
style.setProperty(movementCssVars.y, `${deltaY}px`);
});
function recordDragSample(offset4, timeStamp) {
if (timeStamp === null) {
return;
}
const lastSample = lastDragSampleRef.current;
if (lastSample && timeStamp > lastSample.time) {
const durationMs = Math.max(timeStamp - lastSample.time, MIN_RELEASE_VELOCITY_DURATION_MS);
lastDragVelocityRef.current = {
x: (offset4.x - lastSample.x) / durationMs,
y: (offset4.y - lastSample.y) / durationMs
};
}
lastDragSampleRef.current = {
x: offset4.x,
y: offset4.y,
time: timeStamp
};
}
const reset = React159.useCallback(() => {
setCurrentSwipeDirection(void 0);
setSwiping(false);
setDragDismissed(false);
updateSwipeProgress(0);
swipeThresholdRef.current = swipeThresholdDefault;
swipeThresholdFunctionRef.current = null;
dragStartPosRef.current = {
x: 0,
y: 0
};
dragOffsetRef.current = {
x: 0,
y: 0
};
initialTransformRef.current = {
x: 0,
y: 0,
scale: 1
};
intendedSwipeDirectionRef.current = void 0;
maxSwipeDisplacementRef.current = 0;
cancelledSwipeRef.current = false;
swipeCancelBaselineRef.current = {
x: 0,
y: 0
};
lockedDirectionRef.current = null;
isFirstPointerMoveRef.current = false;
lastMovePosRef.current = null;
pendingSwipeRef.current = false;
pendingSwipeStartPosRef.current = null;
swipeFromScrollableRef.current = false;
sawPrimaryButtonsOnMoveRef.current = false;
elementSizeRef.current = {
width: 0,
height: 0
};
swipeStartTimeRef.current = null;
lastDragSampleRef.current = null;
lastDragVelocityRef.current = {
x: 0,
y: 0
};
lastProgressDetailsRef.current = null;
syncDragStyles(false);
}, [setSwiping, swipeThresholdDefault, syncDragStyles, updateSwipeProgress]);
function getPrimaryPointerPosition(event) {
if ("touches" in event) {
const touch = event.touches[0];
return touch ? {
x: touch.clientX,
y: touch.clientY
} : null;
}
return {
x: event.clientX,
y: event.clientY
};
}
function isTouchLikeEvent(event) {
if ("touches" in event) {
return true;
}
return event.pointerType === "touch";
}
function getTargetAtPoint(position, nativeEvent) {
const root = elementRef.current?.getRootNode();
const elementAtPoint = getElementAtPoint(root, position.x, position.y);
const target = elementAtPoint ?? getTarget(nativeEvent);
return target;
}
function findGestureScrollableTouchTarget(target, root) {
const find = (axis) => {
const scrollTarget = findScrollableTouchTarget(target, root, axis);
const doc = ownerDocument(scrollTarget);
return scrollTarget === doc.body || scrollTarget === doc.documentElement ? null : scrollTarget;
};
if (hasHorizontal && !hasVertical) {
return find("horizontal");
}
if (hasVertical && !hasHorizontal) {
return find("vertical");
}
return find("vertical") ?? find("horizontal");
}
function startSwipeAtPosition(event, position, startOptions) {
swipeFromScrollableRef.current = false;
const touchLike = isTouchLikeEvent(event);
const target = getTargetAtPoint(position, event.nativeEvent);
const doc = ownerDocument(elementRef.current);
const body = doc.body;
const scrollableTarget = touchLike && body ? findGestureScrollableTouchTarget(target, body) : null;
const ignoreScrollableTarget = startOptions?.ignoreScrollableTarget ?? false;
if (scrollableTarget && !ignoreScrollableTarget) {
return false;
}
swipeFromScrollableRef.current = Boolean(scrollableTarget && ignoreScrollableTarget);
const isInteractiveElement2 = target ? target.closest(ignoreSelector) : false;
if (isInteractiveElement2 && (!touchLike || ignoreSelectorWhenTouch)) {
return false;
}
const element = elementRef.current;
if (ignoreScrollableAncestors && element && target && scrollAxes.length > 0) {
const ignoreAncestors = startOptions?.ignoreScrollableAncestors ?? false;
if (!ignoreAncestors && hasScrollableAncestor(target, element, scrollAxes)) {
return false;
}
}
cancelledSwipeRef.current = false;
intendedSwipeDirectionRef.current = void 0;
maxSwipeDisplacementRef.current = 0;
dragStartPosRef.current = position;
swipeStartTimeRef.current = getValidTimeStamp(event.timeStamp);
swipeCancelBaselineRef.current = position;
lastMovePosRef.current = position;
swipeThresholdRef.current = swipeThresholdDefault;
swipeThresholdFunctionRef.current = typeof swipeThresholdProp === "function" ? swipeThresholdProp : null;
if (element) {
elementSizeRef.current = {
width: element.offsetWidth,
height: element.offsetHeight
};
resolveSwipeThreshold(primaryDirection);
const transform = getElementTransform(element);
initialTransformRef.current = transform;
dragOffsetRef.current = {
x: transform.x,
y: transform.y
};
recordDragSample({
x: transform.x,
y: transform.y
}, swipeStartTimeRef.current);
if (!("touches" in event)) {
safelyChangePointerCapture(element, event.pointerId, "setPointerCapture");
}
}
onSwipeStart?.(event.nativeEvent);
setSwiping(true);
lockedDirectionRef.current = null;
isFirstPointerMoveRef.current = true;
updateSwipeProgress(0);
syncDragStyles(true);
return true;
}
function resetPendingSwipeState() {
clearPendingSwipeStartState();
swipeFromScrollableRef.current = false;
lastMovePosRef.current = null;
}
function clearPendingSwipeStartState() {
pendingSwipeRef.current = false;
pendingSwipeStartPosRef.current = null;
}
function cancelSwipeInteraction(event) {
resetPendingSwipeState();
if (!isSwipingRef.current) {
return;
}
setSwiping(false);
lockedDirectionRef.current = null;
const resolvedInitialTransform = initialTransformRef.current;
dragOffsetRef.current = {
x: resolvedInitialTransform.x,
y: resolvedInitialTransform.y
};
setCurrentSwipeDirection(void 0);
sawPrimaryButtonsOnMoveRef.current = false;
syncDragStyles(false);
const element = elementRef.current;
if (element) {
safelyChangePointerCapture(element, event.pointerId, "releasePointerCapture");
}
updateSwipeProgress(0, {
deltaX: 0,
deltaY: 0,
direction: void 0
});
onCancel?.(event.nativeEvent);
}
function applyDirectionalDamping(deltaX, deltaY) {
const exponent = (value) => Math.sign(value) * Math.abs(value) ** 0.5;
const dampAxis = (delta, allowNegative, allowPositive) => {
if (!allowNegative && delta < 0 || !allowPositive && delta > 0) {
return exponent(delta);
}
return delta;
};
const newDeltaX = hasHorizontal ? dampAxis(deltaX, allowLeft, allowRight) : exponent(deltaX);
const newDeltaY = hasVertical ? dampAxis(deltaY, allowUp, allowDown) : exponent(deltaY);
return {
x: newDeltaX,
y: newDeltaY
};
}
function canSwipeFromScrollEdgeOnPendingMove(scrollTarget, deltaX, deltaY) {
const canSwipeOnAxis = (delta, scrollOffset, maxScrollOffset, allowTowardStart, allowTowardEnd) => delta > 0 && scrollOffset <= 0 && allowTowardStart || delta < 0 && scrollOffset >= Math.max(0, maxScrollOffset) && allowTowardEnd;
const absDeltaX = Math.abs(deltaX);
const absDeltaY = Math.abs(deltaY);
if (hasVertical && deltaY !== 0 && (!hasHorizontal || absDeltaY >= absDeltaX)) {
return canSwipeOnAxis(deltaY, scrollTarget.scrollTop, scrollTarget.scrollHeight - scrollTarget.clientHeight, allowDown, allowUp);
}
if (hasHorizontal && deltaX !== 0 && (!hasVertical || absDeltaX > absDeltaY)) {
return canSwipeOnAxis(deltaX, scrollTarget.scrollLeft, scrollTarget.scrollWidth - scrollTarget.clientWidth, allowRight, allowLeft);
}
return null;
}
const handleStart = useStableCallback((event) => {
if (!enabled) {
return;
}
if (event.defaultPrevented || event.nativeEvent.defaultPrevented) {
return;
}
if (!("touches" in event) && event.button !== 0) {
return;
}
const startPos = getPrimaryPointerPosition(event);
if (!startPos) {
return;
}
pendingSwipeRef.current = true;
pendingSwipeStartPosRef.current = startPos;
swipeFromScrollableRef.current = false;
sawPrimaryButtonsOnMoveRef.current = !("touches" in event);
const allowedToStart = canStart ? canStart(startPos, {
nativeEvent: event.nativeEvent,
direction: primaryDirection
}) : true;
if (!allowedToStart) {
return;
}
if (startSwipeAtPosition(event, startPos)) {
clearPendingSwipeStartState();
}
});
function handleMoveCore(event, position, movement) {
if (!enabled || !isSwipingRef.current) {
return;
}
const target = getTarget(event.nativeEvent);
if (isTouchLikeEvent(event) && !swipeFromScrollableRef.current) {
const boundaryElement = event.currentTarget;
if (findGestureScrollableTouchTarget(target, boundaryElement)) {
return;
}
}
if (!("touches" in event)) {
event.preventDefault();
}
if (isFirstPointerMoveRef.current) {
isFirstPointerMoveRef.current = false;
if (trackDrag) {
dragStartPosRef.current = position;
const moveTime = getValidTimeStamp(event.timeStamp);
if (moveTime !== null) {
swipeStartTimeRef.current = moveTime;
}
}
}
const clientX = position.x;
const clientY = position.y;
const movementX = movement.x;
const movementY = movement.y;
if (movementY < 0 && clientY > swipeCancelBaselineRef.current.y || movementY > 0 && clientY < swipeCancelBaselineRef.current.y) {
swipeCancelBaselineRef.current = {
x: swipeCancelBaselineRef.current.x,
y: clientY
};
}
if (movementX < 0 && clientX > swipeCancelBaselineRef.current.x || movementX > 0 && clientX < swipeCancelBaselineRef.current.x) {
swipeCancelBaselineRef.current = {
x: clientX,
y: swipeCancelBaselineRef.current.y
};
}
const deltaX = clientX - dragStartPosRef.current.x;
const deltaY = clientY - dragStartPosRef.current.y;
const cancelDeltaY = clientY - swipeCancelBaselineRef.current.y;
const cancelDeltaX = clientX - swipeCancelBaselineRef.current.x;
let lockedDirection = lockedDirectionRef.current;
if (lockedDirection === null && hasHorizontal && hasVertical) {
const movementDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
if (movementDistance >= MIN_DRAG_THRESHOLD) {
lockedDirection = Math.abs(deltaX) > Math.abs(deltaY) ? "horizontal" : "vertical";
lockedDirectionRef.current = lockedDirection;
}
}
let candidate;
if (!intendedSwipeDirectionRef.current) {
if (lockedDirection === "vertical") {
if (deltaY > 0) {
candidate = "down";
} else if (deltaY < 0) {
candidate = "up";
}
} else if (lockedDirection === "horizontal") {
if (deltaX > 0) {
candidate = "right";
} else if (deltaX < 0) {
candidate = "left";
}
} else if (Math.abs(deltaX) >= Math.abs(deltaY)) {
candidate = deltaX > 0 ? "right" : "left";
} else {
candidate = deltaY > 0 ? "down" : "up";
}
if (candidate) {
const isAllowed = candidate === "left" && allowLeft || candidate === "right" && allowRight || candidate === "up" && allowUp || candidate === "down" && allowDown;
if (isAllowed) {
intendedSwipeDirectionRef.current = candidate;
maxSwipeDisplacementRef.current = getDisplacement(candidate, deltaX, deltaY);
setCurrentSwipeDirection(candidate);
resolveSwipeThreshold(candidate);
}
}
} else {
const direction = intendedSwipeDirectionRef.current;
const currentDisplacement = getDisplacement(direction, cancelDeltaX, cancelDeltaY);
if (currentDisplacement > swipeThresholdRef.current) {
cancelledSwipeRef.current = false;
setCurrentSwipeDirection(direction);
} else if (!(allowLeft && allowRight) && !(allowUp && allowDown) && maxSwipeDisplacementRef.current - currentDisplacement >= REVERSE_CANCEL_THRESHOLD) {
cancelledSwipeRef.current = true;
}
}
const dampedDelta = applyDirectionalDamping(deltaX, deltaY);
let newOffsetX = initialTransformRef.current.x;
let newOffsetY = initialTransformRef.current.y;
if (lockedDirection === "horizontal") {
if (hasHorizontal) {
newOffsetX += dampedDelta.x;
}
} else if (lockedDirection === "vertical") {
if (hasVertical) {
newOffsetY += dampedDelta.y;
}
} else {
if (hasHorizontal) {
newOffsetX += dampedDelta.x;
}
if (hasVertical) {
newOffsetY += dampedDelta.y;
}
}
const previousOffset = dragOffsetRef.current;
const offsetChanged = newOffsetX !== previousOffset.x || newOffsetY !== previousOffset.y;
dragOffsetRef.current = {
x: newOffsetX,
y: newOffsetY
};
if (offsetChanged) {
syncDragStyles(true);
}
recordDragSample({
x: newOffsetX,
y: newOffsetY
}, getValidTimeStamp(event.timeStamp));
const dragDeltaX = newOffsetX - initialTransformRef.current.x;
const dragDeltaY = newOffsetY - initialTransformRef.current.y;
const progressDetails = {
deltaX: dragDeltaX,
deltaY: dragDeltaY,
direction: intendedSwipeDirectionRef.current
};
let progress = 0;
const progressDirection = primaryDirection ?? intendedSwipeDirectionRef.current;
if (progressDirection) {
const size4 = progressDirection === "left" || progressDirection === "right" ? elementSizeRef.current.width : elementSizeRef.current.height;
const scale = initialTransformRef.current.scale || 1;
const progressDisplacement = getDisplacement(progressDirection, dragDeltaX, dragDeltaY);
if (size4 > 0 && scale > 0 && progressDisplacement > 0) {
progress = progressDisplacement / (size4 * scale);
}
}
updateSwipeProgress(progress, progressDetails);
}
const handleEnd = useStableCallback((event) => {
if (!enabled) {
return;
}
const resolvedDragOffset = dragOffsetRef.current;
const resolvedInitialTransform = initialTransformRef.current;
const releaseDeltaX = resolvedDragOffset.x - resolvedInitialTransform.x;
const releaseDeltaY = resolvedDragOffset.y - resolvedInitialTransform.y;
const progressDetails = {
deltaX: releaseDeltaX,
deltaY: releaseDeltaY,
direction: intendedSwipeDirectionRef.current
};
if (!isSwipingRef.current) {
resetPendingSwipeState();
updateSwipeProgress(0, progressDetails);
return;
}
setSwiping(false);
lockedDirectionRef.current = null;
resetPendingSwipeState();
sawPrimaryButtonsOnMoveRef.current = false;
const element = elementRef.current;
if (element) {
if (!("touches" in event)) {
safelyChangePointerCapture(element, event.pointerId, "releasePointerCapture");
}
}
const deltaX = releaseDeltaX;
const deltaY = releaseDeltaY;
const startTime = swipeStartTimeRef.current;
const endTime = getValidTimeStamp(event.timeStamp);
const durationMs = startTime !== null && endTime !== null && endTime > startTime ? endTime - startTime : 0;
const velocityDurationMs = durationMs > 0 ? Math.max(durationMs, MIN_VELOCITY_DURATION_MS) : 0;
const velocityX = velocityDurationMs > 0 ? deltaX / velocityDurationMs : 0;
const velocityY = velocityDurationMs > 0 ? deltaY / velocityDurationMs : 0;
let releaseVelocityX = lastDragVelocityRef.current.x;
let releaseVelocityY = lastDragVelocityRef.current.y;
const lastSample = lastDragSampleRef.current;
if (lastSample && endTime !== null && endTime >= lastSample.time) {
const ageMs = endTime - lastSample.time;
if (ageMs <= MAX_RELEASE_VELOCITY_AGE_MS) {
const sampleDurationMs = Math.max(ageMs, MIN_RELEASE_VELOCITY_DURATION_MS);
const deltaFromLastSampleX = resolvedDragOffset.x - lastSample.x;
const deltaFromLastSampleY = resolvedDragOffset.y - lastSample.y;
const sampleVelocityX = deltaFromLastSampleX / sampleDurationMs;
const sampleVelocityY = deltaFromLastSampleY / sampleDurationMs;
if (sampleVelocityX !== 0) {
releaseVelocityX = sampleVelocityX;
}
if (sampleVelocityY !== 0) {
releaseVelocityY = sampleVelocityY;
}
} else {
releaseVelocityX = 0;
releaseVelocityY = 0;
}
}
const releaseDecision = onRelease?.({
event: event.nativeEvent,
direction: intendedSwipeDirectionRef.current,
deltaX,
deltaY,
velocityX,
velocityY,
releaseVelocityX,
releaseVelocityY
});
const hasReleaseDecision = typeof releaseDecision === "boolean";
if (cancelledSwipeRef.current && !hasReleaseDecision) {
dragOffsetRef.current = {
x: resolvedInitialTransform.x,
y: resolvedInitialTransform.y
};
setCurrentSwipeDirection(void 0);
syncDragStyles(false);
updateSwipeProgress(0, progressDetails);
return;
}
let shouldClose = false;
let dismissDirection;
if (hasReleaseDecision) {
shouldClose = releaseDecision;
dismissDirection = intendedSwipeDirectionRef.current ?? primaryDirection;
} else {
for (const direction of directions2) {
if (getDisplacement(direction, deltaX, deltaY) > swipeThresholdRef.current) {
shouldClose = true;
dismissDirection = direction;
break;
}
}
}
if (shouldClose && dismissDirection) {
setCurrentSwipeDirection(dismissDirection);
setDragDismissed(true);
syncDragStyles(false);
onDismiss?.(event.nativeEvent, {
direction: dismissDirection
});
} else {
dragOffsetRef.current = {
x: resolvedInitialTransform.x,
y: resolvedInitialTransform.y
};
setCurrentSwipeDirection(void 0);
syncDragStyles(false);
updateSwipeProgress(0, progressDetails);
}
});
const handleMove = useStableCallback((event) => {
const currentPos = getPrimaryPointerPosition(event);
if (!currentPos) {
return;
}
let endAfterMove = false;
if (!("touches" in event)) {
const hasPrimaryButton = hasPrimaryMouseButton(event.buttons);
if (hasPrimaryButton) {
sawPrimaryButtonsOnMoveRef.current = true;
}
if (event.buttons !== 0 && !hasPrimaryButton) {
cancelSwipeInteraction(event);
return;
}
if (event.buttons === 0 && sawPrimaryButtonsOnMoveRef.current) {
if (!isSwipingRef.current) {
handleEnd(event);
return;
}
endAfterMove = true;
}
}
if (!isSwiping && pendingSwipeRef.current) {
if (!isTouchLikeEvent(event) && (event.defaultPrevented || event.nativeEvent.defaultPrevented)) {
resetPendingSwipeState();
return;
}
const allowedToStart = canStart ? canStart(currentPos, {
nativeEvent: event.nativeEvent,
direction: primaryDirection
}) : true;
if (allowedToStart) {
const pendingStartPos = pendingSwipeStartPosRef.current;
let ignoreScrollableOnStart = false;
if (isTouchLikeEvent(event)) {
const element = elementRef.current;
if (pendingStartPos && element) {
const target = getTargetAtPoint(currentPos, event.nativeEvent);
const doc = ownerDocument(element);
const body = doc.body;
const scrollTarget = body ? findGestureScrollableTouchTarget(target, body) : null;
if (scrollTarget && (contains(element, scrollTarget) || contains(scrollTarget, element))) {
const deltaX = currentPos.x - pendingStartPos.x;
const deltaY = currentPos.y - pendingStartPos.y;
const canSwipeFromEdge = canSwipeFromScrollEdgeOnPendingMove(scrollTarget, deltaX, deltaY);
if (canSwipeFromEdge === false) {
return;
}
if (canSwipeFromEdge === true) {
ignoreScrollableOnStart = true;
}
}
}
}
const started = startSwipeAtPosition(event, currentPos, {
ignoreScrollableTarget: ignoreScrollableOnStart,
ignoreScrollableAncestors: ignoreScrollableOnStart
});
if (started) {
if (pendingStartPos && ignoreScrollableOnStart) {
clearPendingSwipeStartState();
dragStartPosRef.current = pendingStartPos;
swipeCancelBaselineRef.current = pendingStartPos;
lastMovePosRef.current = pendingStartPos;
isFirstPointerMoveRef.current = false;
} else {
clearPendingSwipeStartState();
swipeFromScrollableRef.current = false;
}
}
}
}
const previousPos = lastMovePosRef.current;
const movement = previousPos === null ? {
x: 0,
y: 0
} : {
x: currentPos.x - previousPos.x,
y: currentPos.y - previousPos.y
};
lastMovePosRef.current = currentPos;
handleMoveCore(event, currentPos, movement);
if (endAfterMove && !("touches" in event)) {
handleEnd(event);
}
});
const moveNative = useStableCallback((nativeEvent, currentTarget) => {
handleMove({
touches: nativeEvent.touches,
currentTarget,
nativeEvent,
defaultPrevented: nativeEvent.defaultPrevented,
timeStamp: nativeEvent.timeStamp
});
});
const getDragStyles = React159.useCallback(() => {
const swiping3 = isSwipingRef.current;
const dragOffset = dragOffsetRef.current;
const initialTransform = initialTransformRef.current;
const deltaX = dragOffset.x - initialTransform.x;
const deltaY = dragOffset.y - initialTransform.y;
if (!swiping3 && deltaX === 0 && deltaY === 0 && !dragDismissed) {
return {
[movementCssVars.x]: "0px",
[movementCssVars.y]: "0px"
};
}
return {
transition: swiping3 ? "none" : void 0,
// While swiping, freeze the element at its current visual transform so it doesn't snap to the
// end position.
transform: swiping3 ? getDragTransform(dragOffset, initialTransform.scale) : void 0,
[movementCssVars.x]: `${deltaX}px`,
[movementCssVars.y]: `${deltaY}px`
};
}, [dragDismissed, movementCssVars]);
const getPointerProps = React159.useCallback(() => {
if (!enabled) {
return {};
}
return {
onPointerDown: handleStart,
onPointerMove: handleMove,
onPointerUp: handleEnd,
onPointerCancel: handleEnd
};
}, [enabled, handleEnd, handleMove, handleStart]);
const getTouchProps = React159.useCallback(() => {
if (!enabled) {
return {};
}
return {
onTouchStart: handleStart,
onTouchMove: handleMove,
onTouchEnd: handleEnd,
onTouchCancel: handleEnd
};
}, [enabled, handleEnd, handleMove, handleStart]);
return {
swiping: isSwiping,
swipeDirection: currentSwipeDirection,
dragDismissed,
getPointerProps,
getTouchProps,
moveNative,
getDragStyles,
reset
};
}
// node_modules/@base-ui/react/drawer/swipe-area/DrawerSwipeAreaDataAttributes.mjs
var open5 = CommonPopupDataAttributes_exports.open;
var closed5 = CommonPopupDataAttributes_exports.closed;
var disabled2 = "data-disabled";
var swipeDirection2 = "data-swipe-direction";
var swiping2 = "data-swiping";
// node_modules/@base-ui/react/drawer/swipe-area/DrawerSwipeArea.mjs
var DEFAULT_SWIPE_OPEN_RATIO = 0.5;
var MIN_SWIPE_START_DISTANCE = 1;
var VELOCITY_THRESHOLD = 0.1;
var FALLBACK_SWIPE_OPEN_THRESHOLD = 40;
var SWIPE_AREA_OPEN_HOOK = {
[open5]: ""
};
var SWIPE_AREA_CLOSED_HOOK = {
[closed5]: ""
};
var SWIPE_AREA_SWIPING_HOOK = {
[swiping2]: ""
};
var SWIPE_AREA_DISABLED_HOOK = {
[disabled2]: ""
};
var stateAttributesMapping8 = {
open(value) {
return value ? SWIPE_AREA_OPEN_HOOK : SWIPE_AREA_CLOSED_HOOK;
},
swiping(value) {
return value ? SWIPE_AREA_SWIPING_HOOK : null;
},
swipeDirection(value) {
return {
[swipeDirection2]: value
};
},
disabled(value) {
return value ? SWIPE_AREA_DISABLED_HOOK : null;
}
};
var oppositeSwipeDirection = {
up: "down",
down: "up",
left: "right",
right: "left"
};
function resolveTouchAction(direction) {
return direction === "left" || direction === "right" ? "pan-y" : "pan-x";
}
var DrawerSwipeArea = /* @__PURE__ */ React160.forwardRef(function DrawerSwipeArea2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
disabled: disabled3 = false,
swipeDirection: swipeDirectionProp,
...elementProps
} = componentProps;
const store = useDialogRootContext();
const {
swipeDirection: swipeDirection3,
frontmostHeight: frontmostHeight2,
swipeAreaActiveRef
} = useDrawerRootContext();
const providerContext = useDrawerProviderContext();
const [swipeActive, setSwipeActive] = React160.useState(false);
const swipeAreaRef = React160.useRef(null);
const swipeStartEventRef = React160.useRef(null);
const openedBySwipeRef = React160.useRef(false);
const dragDeltaRef = React160.useRef({
x: 0,
y: 0
});
const closedOffsetRef = React160.useRef(null);
const appliedSwipeStylesRef = React160.useRef(false);
const swipePopupElementRef = React160.useRef(null);
const swipeBackdropElementRef = React160.useRef(null);
const popupTransitionRef = React160.useRef(null);
const releaseGuardCleanupRef = React160.useRef(NOOP);
const swipeAreaId = useBaseUiId(componentProps.id);
const registerTrigger = useTriggerRegistration(swipeAreaId, store);
useIsoLayoutEffect(() => {
registerTrigger(swipeAreaRef.current);
return () => registerTrigger(null);
}, [registerTrigger, swipeAreaId, store]);
const open7 = store.useState("open");
const resetDragDelta = useStableCallback(() => {
dragDeltaRef.current.x = 0;
dragDeltaRef.current.y = 0;
});
const resolvedSwipeDirection = swipeDirectionProp ?? oppositeSwipeDirection[swipeDirection3];
const dismissDirection = oppositeSwipeDirection[resolvedSwipeDirection];
const enabled = !disabled3 && (!open7 || swipeActive);
function disableDismissForSwipe() {
releaseGuardCleanupRef.current();
store.context.outsidePressEnabledRef.current = false;
}
const enableDismissAfterRelease = useStableCallback(() => {
releaseGuardCleanupRef.current();
const doc = ownerDocument(swipeAreaRef.current);
function restore(event) {
if (event?.type === "click" && event.detail !== 0 && !isVirtualClick(event)) {
return;
}
releaseGuardCleanupRef.current = NOOP;
doc.removeEventListener("pointerdown", restore, true);
doc.removeEventListener("click", restore, true);
store.context.outsidePressEnabledRef.current = true;
}
releaseGuardCleanupRef.current = restore;
doc.addEventListener("pointerdown", restore, true);
doc.addEventListener("click", restore, true);
});
function getPopupSize(popupElement) {
const isHorizontal = dismissDirection === "left" || dismissDirection === "right";
const size4 = isHorizontal ? popupElement.offsetWidth : popupElement.offsetHeight;
if (size4 <= 0) {
return null;
}
return size4;
}
function resolvePopupSize() {
const popupElement = store.context.popupRef.current;
return popupElement ? getPopupSize(popupElement) : null;
}
function resolveClosedOffset(popupElement) {
const offset4 = getPopupSize(popupElement);
if (offset4 == null) {
return null;
}
const isHorizontal = dismissDirection === "left" || dismissDirection === "right";
const transform = getElementTransform(popupElement);
const transformOffset = isHorizontal ? transform.x : transform.y;
if (Number.isFinite(transformOffset) && Math.abs(transformOffset) > 0.5) {
return Math.min(offset4, Math.abs(transformOffset));
}
return offset4;
}
function resolveSwipeOpenThreshold() {
const popupSize = resolvePopupSize();
if (popupSize == null) {
return FALLBACK_SWIPE_OPEN_THRESHOLD;
}
return popupSize * DEFAULT_SWIPE_OPEN_RATIO;
}
function applySwipeMovement() {
const popupElement = store.context.popupRef.current;
if (!popupElement) {
return;
}
if (!store.select("open") || !store.select("mounted")) {
return;
}
if (closedOffsetRef.current == null) {
closedOffsetRef.current = resolveClosedOffset(popupElement);
}
const closedOffset = closedOffsetRef.current;
if (closedOffset === null) {
return;
}
const {
x: x2,
y: y2
} = dragDeltaRef.current;
const displacement = getDisplacement(resolvedSwipeDirection, x2, y2);
const clampedDisplacement = Math.max(0, displacement);
const dampedDisplacement = clampedDisplacement > closedOffset ? closedOffset + Math.sqrt(clampedDisplacement - closedOffset) : clampedDisplacement;
const remaining = closedOffset - dampedDisplacement;
const directionSign = dismissDirection === "left" || dismissDirection === "up" ? -1 : 1;
const movement = remaining * directionSign;
const isHorizontal = dismissDirection === "left" || dismissDirection === "right";
const movementX = isHorizontal ? movement : 0;
const movementY = isHorizontal ? 0 : movement;
const openProgress = Math.max(0, Math.min(1, clampedDisplacement / closedOffset));
const backdropProgress = Math.max(0, Math.min(1, 1 - openProgress));
popupElement.style.setProperty(swipeMovementX, `${movementX}px`);
popupElement.style.setProperty(swipeMovementY, `${movementY}px`);
popupElement.setAttribute(swiping, "");
swipePopupElementRef.current = popupElement;
if (popupTransitionRef.current === null) {
popupTransitionRef.current = popupElement.style.transition;
}
popupElement.style.transition = "none";
const backdropElement = store.context.backdropRef.current;
if (backdropElement) {
backdropElement.setAttribute(swiping, "");
swipeBackdropElementRef.current = backdropElement;
backdropElement.style.setProperty(swipeProgress, `${backdropProgress}`);
if (openProgress > 0 && frontmostHeight2 > 0) {
backdropElement.style.setProperty(height, `${frontmostHeight2}px`);
} else {
backdropElement.style.removeProperty(height);
}
}
providerContext?.visualStateStore.set({
swipeProgress: openProgress,
frontmostHeight: openProgress > 0 ? frontmostHeight2 : 0
});
appliedSwipeStylesRef.current = true;
swipeAreaActiveRef.current = true;
}
const clearSwipeStyles = useStableCallback(() => {
const popupElement = swipePopupElementRef.current;
if (popupElement) {
popupElement.style.removeProperty(swipeMovementX);
popupElement.style.removeProperty(swipeMovementY);
popupElement.removeAttribute(swiping);
}
if (popupElement && popupTransitionRef.current !== null) {
popupElement.style.transition = popupTransitionRef.current;
popupTransitionRef.current = null;
}
const backdropElement = swipeBackdropElementRef.current;
if (backdropElement) {
backdropElement.removeAttribute(swiping);
backdropElement.style.setProperty(swipeProgress, "0");
backdropElement.style.removeProperty(height);
}
providerContext?.visualStateStore.set({
swipeProgress: 0,
frontmostHeight: 0
});
appliedSwipeStylesRef.current = false;
swipePopupElementRef.current = null;
swipeBackdropElementRef.current = null;
swipeAreaActiveRef.current = false;
});
function openDrawer(event) {
openedBySwipeRef.current = true;
store.setOpen(true, createChangeEventDetails(reason_parts_exports.swipe, event, swipeAreaRef.current));
}
function closeDrawer(event) {
store.setOpen(false, createChangeEventDetails(reason_parts_exports.swipe, event, swipeAreaRef.current));
}
function resetSwipeInteractionState() {
swipeStartEventRef.current = null;
openedBySwipeRef.current = false;
closedOffsetRef.current = null;
setSwipeActive(false);
}
function finishSwipeInteraction() {
resetSwipeInteractionState();
enableDismissAfterRelease();
resetDragDelta();
clearSwipeStyles();
}
const swipe2 = useSwipeDismiss({
enabled,
directions: [resolvedSwipeDirection],
elementRef: swipeAreaRef,
trackDrag: false,
movementCssVars: {
x: swipeMovementX,
y: swipeMovementY
},
onSwipeStart(event) {
disableDismissForSwipe();
swipeStartEventRef.current = event;
openedBySwipeRef.current = false;
setSwipeActive(true);
resetDragDelta();
},
onProgress(_progress, details) {
if (!details) {
return;
}
if (!swipeStartEventRef.current) {
return;
}
dragDeltaRef.current.x = details.deltaX;
dragDeltaRef.current.y = details.deltaY;
if (details.direction !== resolvedSwipeDirection) {
return;
}
const displacement = getDisplacement(resolvedSwipeDirection, details.deltaX, details.deltaY);
if (!openedBySwipeRef.current && displacement < MIN_SWIPE_START_DISTANCE) {
return;
}
if (!openedBySwipeRef.current && !store.select("open")) {
openDrawer(swipeStartEventRef.current);
}
applySwipeMovement();
},
onRelease({
event,
direction,
deltaX,
deltaY,
releaseVelocityX,
releaseVelocityY
}) {
const displacement = getDisplacement(resolvedSwipeDirection, deltaX, deltaY);
const releaseVelocity = getDisplacement(resolvedSwipeDirection, releaseVelocityX, releaseVelocityY);
const threshold = resolveSwipeOpenThreshold();
const hasEnoughDistance = displacement >= threshold;
const hasEnoughVelocity = releaseVelocity >= VELOCITY_THRESHOLD;
const shouldOpen = direction === resolvedSwipeDirection && (hasEnoughDistance || hasEnoughVelocity) && !disabled3;
if (shouldOpen) {
if (!store.select("open")) {
openDrawer(event);
}
} else if (openedBySwipeRef.current && store.select("open")) {
closeDrawer(event);
}
finishSwipeInteraction();
return false;
},
onCancel: finishSwipeInteraction
});
const swipePointerProps = swipe2.getPointerProps();
const swipeTouchProps = swipe2.getTouchProps();
const resetSwipe = swipe2.reset;
useIsoLayoutEffect(() => {
if (swipeActive && appliedSwipeStylesRef.current) {
applySwipeMovement();
}
});
useIsoLayoutEffect(() => {
if (!enabled) {
if (swipeActive) {
enableDismissAfterRelease();
}
resetSwipe();
resetDragDelta();
clearSwipeStyles();
resetSwipeInteractionState();
}
}, [clearSwipeStyles, enableDismissAfterRelease, enabled, resetDragDelta, resetSwipe, swipeActive]);
React160.useEffect(() => {
return () => {
releaseGuardCleanupRef.current();
store.context.outsidePressEnabledRef.current = true;
};
}, [store]);
const state = {
open: open7,
swiping: swipe2.swiping,
swipeDirection: resolvedSwipeDirection,
disabled: disabled3
};
return useRenderElement("div", componentProps, {
state,
ref: [forwardedRef, swipeAreaRef, registerTrigger],
stateAttributesMapping: stateAttributesMapping8,
props: [{
role: "presentation",
"aria-hidden": true,
style: {
pointerEvents: !enabled ? "none" : void 0,
touchAction: resolveTouchAction(resolvedSwipeDirection)
},
onPointerDown(event) {
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerDown?.(event);
if (event.cancelable) {
event.preventDefault();
}
},
onPointerMove(event) {
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerMove?.(event);
},
onPointerUp(event) {
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerUp?.(event);
},
onPointerCancel(event) {
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerCancel?.(event);
}
}, swipeTouchProps, swipeAreaId ? {
id: swipeAreaId
} : void 0, elementProps]
});
});
if (true) DrawerSwipeArea.displayName = "DrawerSwipeArea";
// node_modules/@base-ui/react/drawer/title/DrawerTitle.mjs
var DrawerTitle = DialogTitle;
// node_modules/@base-ui/react/drawer/trigger/DrawerTrigger.mjs
var DrawerTrigger = DialogTrigger;
// node_modules/@base-ui/react/drawer/viewport/DrawerViewport.mjs
var React162 = __toESM(require_react(), 1);
var ReactDOM9 = __toESM(require_react_dom(), 1);
// node_modules/@base-ui/react/dialog/viewport/DialogViewportDataAttributes.mjs
var open6 = CommonPopupDataAttributes_exports.open;
var closed6 = CommonPopupDataAttributes_exports.closed;
var startingStyle6 = CommonPopupDataAttributes_exports.startingStyle;
var endingStyle6 = CommonPopupDataAttributes_exports.endingStyle;
var nestedDialogOpen2 = "data-nested-dialog-open";
// node_modules/@base-ui/react/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardContext.mjs
var React161 = __toESM(require_react(), 1);
var DrawerVirtualKeyboardContext = /* @__PURE__ */ React161.createContext(void 0);
if (true) DrawerVirtualKeyboardContext.displayName = "DrawerVirtualKeyboardContext";
function useDrawerVirtualKeyboardContext() {
return React161.useContext(DrawerVirtualKeyboardContext);
}
// node_modules/@base-ui/react/drawer/viewport/DrawerViewport.mjs
var import_jsx_runtime42 = __toESM(require_jsx_runtime(), 1);
var MIN_SWIPE_THRESHOLD = 10;
var FAST_SWIPE_VELOCITY = 0.5;
var SNAP_VELOCITY_THRESHOLD = 0.5;
var SNAP_VELOCITY_MULTIPLIER = 300;
var MAX_SNAP_VELOCITY = 4;
var MIN_SWIPE_RELEASE_VELOCITY = 0.2;
var MAX_SWIPE_RELEASE_VELOCITY = 4;
var MIN_SWIPE_RELEASE_DURATION_MS = 80;
var MAX_SWIPE_RELEASE_DURATION_MS = 360;
var MIN_SWIPE_RELEASE_SCALAR = 0.1;
var MAX_SWIPE_RELEASE_SCALAR = 1;
var AXIS_LOCK_SLOP = 6;
var AXIS_LOCK_BIAS = 2;
var DRAWER_CONTENT_SELECTOR = `[${DRAWER_CONTENT_ATTRIBUTE}]`;
var DrawerViewport = /* @__PURE__ */ React162.forwardRef(function DrawerViewport2(props, forwardedRef) {
const {
render: render4,
className,
style,
children,
...elementProps
} = props;
const store = useDialogRootContext();
const popupRef = store.context.popupRef;
const backdropRef = store.context.backdropRef;
const {
swipeDirection: swipeDirection3,
notifyParentSwipingChange,
notifyParentSwipeProgressChange,
frontmostHeight: frontmostHeight2,
snapToSequentialPoints,
swipeAreaActiveRef
} = useDrawerRootContext();
const providerContext = useDrawerProviderContext();
const {
snapPoints,
resolvedSnapPoints,
activeSnapPoint,
activeSnapPointOffset,
setActiveSnapPoint,
popupHeight: popupHeight2
} = useDrawerSnapPoints();
const open7 = store.useState("open");
const mounted = store.useState("mounted");
const nested = store.useState("nested");
const nestedOpenDrawerCount = store.useState("nestedOpenDrawerCount");
const viewportElement = store.useState("viewportElement");
const popupElementState = store.useState("popupElement");
const visualStateStore = providerContext?.visualStateStore;
const nestedDrawerOpen2 = nestedOpenDrawerCount > 0;
const scrollAxis = swipeDirection3 === "left" || swipeDirection3 === "right" ? "horizontal" : "vertical";
const isVerticalScrollAxis = scrollAxis === "vertical";
const crossScrollAxis = isVerticalScrollAxis ? "horizontal" : "vertical";
const [swipeRelease, setSwipeRelease] = React162.useState(null);
const pendingSwipeCloseSnapPointRef = React162.useRef(void 0);
const resetSwipeRef = React162.useRef(null);
const controlledDismissFrame = useAnimationFrame();
const swipingRef = React162.useRef(false);
const nestedSwipeActiveRef = React162.useRef(false);
const lastPointerTypeRef = React162.useRef("");
const ignoreNextTouchStartFromPenRef = React162.useRef(false);
const ignoreTouchSwipeRef = React162.useRef(false);
const touchScrollStateRef = React162.useRef(null);
const virtualKeyboard = useDrawerVirtualKeyboardContext();
const snapPointRange = React162.useMemo(() => {
if (!snapPoints || snapPoints.length < 2 || resolvedSnapPoints.length < 2 || swipeDirection3 !== "down" && swipeDirection3 !== "up") {
return null;
}
const offsets = resolvedSnapPoints.map((point) => point.offset).sort((a, b) => a - b);
const minOffset = offsets[0];
const nextOffset = offsets[1];
const range = nextOffset - minOffset;
return {
minOffset,
range
};
}, [resolvedSnapPoints, snapPoints, swipeDirection3]);
const snapPointProgress = React162.useMemo(() => {
if (!snapPointRange || activeSnapPointOffset === null) {
return null;
}
return clamp2((activeSnapPointOffset - snapPointRange.minOffset) / snapPointRange.range, 0, 1);
}, [activeSnapPointOffset, snapPointRange]);
const swipeDirections = React162.useMemo(() => {
if (snapPoints && snapPoints.length > 0 && (swipeDirection3 === "down" || swipeDirection3 === "up")) {
return swipeDirection3 === "down" ? ["down", "up"] : ["up", "down"];
}
return [swipeDirection3];
}, [snapPoints, swipeDirection3]);
const setSwipeDismissed = useStableCallback((dismissed) => {
popupRef.current?.toggleAttribute(swipeDismiss, dismissed);
backdropRef.current?.toggleAttribute(swipeDismiss, dismissed);
});
const clearSwipeRelease = useStableCallback(() => {
setSwipeDismissed(false);
popupRef.current?.removeAttribute(TransitionStatusDataAttributes_exports.endingStyle);
setSwipeRelease(null);
});
const finishNestedSwipe = useStableCallback(() => {
if (!nestedSwipeActiveRef.current) {
return;
}
nestedSwipeActiveRef.current = false;
notifyParentSwipingChange?.(false);
});
const applySwipeProgress = useStableCallback((resolvedProgress, shouldTrackProgress, notifyParent) => {
const isActive = open7 && !nested && shouldTrackProgress;
const swipeProgress2 = isActive ? resolvedProgress : 0;
const nestedSwipeProgress = open7 && shouldTrackProgress ? resolvedProgress : 0;
if (notifyParent && notifyParentSwipeProgressChange) {
notifyParentSwipeProgressChange(nestedSwipeProgress);
if (nestedSwipeProgress <= 0) {
finishNestedSwipe();
}
}
visualStateStore?.set({
swipeProgress: swipeProgress2,
frontmostHeight: swipeProgress2 > 0 ? frontmostHeight2 : 0
});
const backdropElement = backdropRef.current;
if (!backdropElement) {
return;
}
const showProgress = isActive && swipeProgress2 > 0;
backdropElement.style.setProperty(swipeProgress, showProgress ? `${swipeProgress2}` : "0");
if (showProgress && frontmostHeight2 > 0) {
backdropElement.style.setProperty(height, `${frontmostHeight2}px`);
} else {
backdropElement.style.removeProperty(height);
}
});
function resolveSwipeRelease(popupElement, direction, deltaX, deltaY, velocityX, velocityY, releaseVelocityX, releaseVelocityY) {
const size4 = getBaseSwipeSize(popupElement, direction);
if (size4 <= 0) {
return null;
}
const snapPointBaseOffset = (direction === "down" || direction === "up") && snapPoints && snapPoints.length > 0 ? activeSnapPointOffset ?? 0 : 0;
const translationAlongDirection = snapPointBaseOffset + getDisplacement(direction, deltaX, deltaY);
const remainingDistance = Math.max(0, size4 - translationAlongDirection);
if (remainingDistance <= 0) {
return null;
}
const releaseVelocity = getDisplacement(direction, releaseVelocityX, releaseVelocityY);
const directionalVelocity = Math.abs(releaseVelocity) > 0 ? releaseVelocity : getDisplacement(direction, velocityX, velocityY);
if (directionalVelocity <= MIN_SWIPE_RELEASE_VELOCITY) {
return null;
}
const clampedVelocity = clamp2(directionalVelocity, MIN_SWIPE_RELEASE_VELOCITY, MAX_SWIPE_RELEASE_VELOCITY);
const durationMs = clamp2(remainingDistance / clampedVelocity, MIN_SWIPE_RELEASE_DURATION_MS, MAX_SWIPE_RELEASE_DURATION_MS);
const normalizedDuration = (durationMs - MIN_SWIPE_RELEASE_DURATION_MS) / (MAX_SWIPE_RELEASE_DURATION_MS - MIN_SWIPE_RELEASE_DURATION_MS);
return MIN_SWIPE_RELEASE_SCALAR + normalizedDuration * (MAX_SWIPE_RELEASE_SCALAR - MIN_SWIPE_RELEASE_SCALAR);
}
function updateNestedSwipeActive(details) {
if (nestedSwipeActiveRef.current || !details) {
return;
}
const direction = details.direction ?? swipeDirection3;
const delta = getDisplacement(direction, details.deltaX, details.deltaY);
if (Math.abs(delta) < MIN_SWIPE_THRESHOLD) {
return;
}
nestedSwipeActiveRef.current = true;
notifyParentSwipingChange?.(true);
}
const swipe2 = useSwipeDismiss({
enabled: mounted && !nestedDrawerOpen2,
directions: swipeDirections,
elementRef: store.context.popupRef,
ignoreSelectorWhenTouch: false,
ignoreScrollableAncestors: true,
movementCssVars: {
x: swipeMovementX,
y: swipeMovementY
},
onSwipeStart(event) {
if ("touches" in event || event.pointerType === "touch") {
return;
}
const popupElement = popupRef.current;
const doc = ownerDocument(popupElement);
const selection = doc.getSelection?.();
if (!selection || selection.isCollapsed) {
return;
}
const anchorElement = isElement(selection.anchorNode) ? selection.anchorNode : selection.anchorNode?.parentElement;
const focusElement = isElement(selection.focusNode) ? selection.focusNode : selection.focusNode?.parentElement;
if (!contains(popupElement, anchorElement) && !contains(popupElement, focusElement)) {
return;
}
selection.removeAllRanges();
},
onSwipingChange(swiping3) {
swipingRef.current = swiping3;
setBackdropSwipingAttribute(store.context.backdropRef.current, swiping3);
if (!swiping3 && !notifyParentSwipeProgressChange) {
finishNestedSwipe();
}
},
swipeThreshold({
element,
direction
}) {
return getBaseSwipeThreshold(element, direction);
},
canStart(position, details) {
const popupElement = store.context.popupRef.current;
if (!popupElement) {
return false;
}
const doc = popupElement.ownerDocument;
const elementAtPoint = getElementAtPoint(popupElement.getRootNode(), position.x, position.y);
if (!elementAtPoint || !contains(popupElement, elementAtPoint)) {
return false;
}
const nativeEvent = details.nativeEvent;
const touchLike = "touches" in nativeEvent || nativeEvent.pointerType === "touch";
if (touchLike && shouldIgnoreSwipeForTextSelection(doc, popupElement)) {
return false;
}
return true;
},
onProgress(progress, details) {
const swiping3 = swipingRef.current;
if (swiping3) {
updateNestedSwipeActive(details);
}
const hasSnapPoints = Boolean(snapPoints && snapPoints.length > 0);
if (swiping3 && swipeDirection3 === "down" && hasSnapPoints && details) {
const popupElement = store.context.popupRef.current;
if (popupElement) {
popupElement.style.removeProperty("transform");
popupElement.style.setProperty(swipeMovementY, `${getSnapPointSwipeMovement(activeSnapPointOffset ?? 0, details.deltaY)}px`);
}
}
let resolvedProgress = progress;
if (snapPointRange && popupHeight2 > 0) {
const baseOffset = activeSnapPointOffset ?? snapPointRange.minOffset;
const offsetToProgress = (nextOffset) => clamp2((nextOffset - snapPointRange.minOffset) / snapPointRange.range, 0, 1);
if (swiping3 && details && Number.isFinite(details.deltaY)) {
resolvedProgress = offsetToProgress(clamp2(baseOffset + details.deltaY, 0, popupHeight2));
} else if (snapPointProgress !== null) {
resolvedProgress = snapPointProgress;
}
}
if (!swiping3) {
notifyParentSwipeProgressChange?.(0);
finishNestedSwipe();
}
applySwipeProgress(resolvedProgress, true, swiping3);
},
onRelease({
event,
deltaX,
deltaY,
direction,
velocityX,
velocityY,
releaseVelocityX,
releaseVelocityY
}) {
const popupElement = store.context.popupRef.current;
if (!popupElement) {
clearSwipeRelease();
return void 0;
}
const releasePopupElement = popupElement;
function startSwipeRelease(resolvedDirection) {
finishNestedSwipe();
setSwipeDismissed(true);
releasePopupElement.style.removeProperty("transition");
releasePopupElement.setAttribute(TransitionStatusDataAttributes_exports.endingStyle, "");
ReactDOM9.flushSync(() => {
setSwipeRelease(resolveSwipeRelease(releasePopupElement, resolvedDirection, deltaX, deltaY, velocityX, velocityY, releaseVelocityX, releaseVelocityY));
});
}
if (!snapPoints || snapPoints.length === 0) {
if (!direction) {
clearSwipeRelease();
return void 0;
}
const directionalDelta = getDisplacement(direction, deltaX, deltaY);
if (directionalDelta <= 0) {
clearSwipeRelease();
return false;
}
if (getDisplacement(direction, velocityX, velocityY) >= FAST_SWIPE_VELOCITY) {
startSwipeRelease(direction);
return true;
}
const shouldClose = directionalDelta > getBaseSwipeThreshold(releasePopupElement, direction);
if (shouldClose) {
startSwipeRelease(direction);
} else {
clearSwipeRelease();
}
return shouldClose;
}
if (swipeDirection3 !== "down" && swipeDirection3 !== "up") {
clearSwipeRelease();
return void 0;
}
if (!popupHeight2) {
clearSwipeRelease();
return false;
}
if (resolvedSnapPoints.length === 0) {
clearSwipeRelease();
return void 0;
}
const dragDelta = swipeDirection3 === "down" ? deltaY : -deltaY;
const dragDirection = Math.sign(dragDelta);
const releaseDirectionalVelocity = swipeDirection3 === "down" ? releaseVelocityY : -releaseVelocityY;
const fallbackDirectionalVelocity = swipeDirection3 === "down" ? velocityY : -velocityY;
let resolvedDirectionalVelocity = releaseDirectionalVelocity;
if (dragDirection !== 0 && Math.abs(dragDelta) >= MIN_SWIPE_THRESHOLD) {
const velocityDirection = Math.sign(resolvedDirectionalVelocity);
if (velocityDirection !== 0 && velocityDirection !== dragDirection) {
resolvedDirectionalVelocity = fallbackDirectionalVelocity;
}
}
const currentOffset = activeSnapPointOffset ?? 0;
const dragTargetOffset = clamp2(currentOffset + dragDelta, 0, popupHeight2);
const velocityOffset = Math.abs(resolvedDirectionalVelocity) >= SNAP_VELOCITY_THRESHOLD ? clamp2(resolvedDirectionalVelocity, -MAX_SNAP_VELOCITY, MAX_SNAP_VELOCITY) * SNAP_VELOCITY_MULTIPLIER : 0;
const targetOffset = snapToSequentialPoints ? dragTargetOffset : clamp2(dragTargetOffset + velocityOffset, 0, popupHeight2);
const snapPointEventDetails = createChangeEventDetails(reason_parts_exports.swipe, event);
const settleInPlace = () => {
applySwipeProgress(0, true, true);
clearSwipeRelease();
return false;
};
const settleOnSnapPoint = (snapPoint) => {
setActiveSnapPoint(snapPoint.value, snapPointEventDetails);
return settleInPlace();
};
const closeFromSnapPoints = (fallbackSnapPoint) => {
if (!direction) {
return settleOnSnapPoint(fallbackSnapPoint);
}
setActiveSnapPoint(null, snapPointEventDetails);
if (snapPointEventDetails.isCanceled) {
return settleInPlace();
}
pendingSwipeCloseSnapPointRef.current = activeSnapPoint;
startSwipeRelease(swipeDirection3);
return true;
};
if (snapToSequentialPoints) {
const orderedSnapPoints = [...resolvedSnapPoints].sort((first, second) => first.offset - second.offset);
const orderedOffsets = orderedSnapPoints.map((point) => point.offset);
const currentIndex = closestSnapPointIndex(orderedOffsets, currentOffset);
let targetSnapPoint = orderedSnapPoints[closestSnapPointIndex(orderedOffsets, targetOffset)];
const velocityDirection = Math.sign(resolvedDirectionalVelocity);
const shouldAdvance = dragDirection !== 0 && velocityDirection !== 0 && velocityDirection === dragDirection && Math.abs(resolvedDirectionalVelocity) >= SNAP_VELOCITY_THRESHOLD;
let effectiveTargetOffset = targetOffset;
if (shouldAdvance) {
const adjacentIndex = clamp2(currentIndex + dragDirection, 0, orderedSnapPoints.length - 1);
if (adjacentIndex !== currentIndex) {
const adjacentPoint = orderedSnapPoints[adjacentIndex];
const shouldForceAdjacent = dragDirection > 0 ? targetOffset < adjacentPoint.offset : targetOffset > adjacentPoint.offset;
if (shouldForceAdjacent) {
targetSnapPoint = adjacentPoint;
effectiveTargetOffset = adjacentPoint.offset;
}
} else if (dragDirection > 0) {
return closeFromSnapPoints(targetSnapPoint);
}
}
const closeDistance2 = Math.abs(effectiveTargetOffset - popupHeight2);
const snapDistance = Math.abs(effectiveTargetOffset - targetSnapPoint.offset);
if (closeDistance2 < snapDistance) {
return closeFromSnapPoints(targetSnapPoint);
}
return settleOnSnapPoint(targetSnapPoint);
}
const closestSnapPoint = resolvedSnapPoints[closestSnapPointIndex(resolvedSnapPoints.map((point) => point.offset), targetOffset)];
if (resolvedDirectionalVelocity >= FAST_SWIPE_VELOCITY && dragDelta > 0) {
return closeFromSnapPoints(closestSnapPoint);
}
const closeDistance = Math.abs(targetOffset - popupHeight2);
if (closeDistance < Math.abs(targetOffset - closestSnapPoint.offset)) {
return closeFromSnapPoints(closestSnapPoint);
}
return settleOnSnapPoint(closestSnapPoint);
},
onDismiss(event) {
visualStateStore?.set({
swipeProgress: 0,
frontmostHeight: 0
});
const backdropElement = store.context.backdropRef.current;
if (backdropElement) {
backdropElement.style.setProperty(swipeProgress, "0");
backdropElement.style.removeProperty(height);
}
const dismissEventDetails = createChangeEventDetails(reason_parts_exports.swipe, event);
store.setOpen(false, dismissEventDetails);
if (dismissEventDetails.isCanceled) {
const pendingSnapPoint = pendingSwipeCloseSnapPointRef.current;
if (pendingSnapPoint !== void 0) {
setActiveSnapPoint(pendingSnapPoint, createChangeEventDetails(reason_parts_exports.swipe, event));
}
pendingSwipeCloseSnapPointRef.current = void 0;
resetSwipeRef.current?.();
clearSwipeRelease();
return;
}
if (store.select("open")) {
const savedEvent = event;
controlledDismissFrame.request(() => {
if (store.select("open")) {
const pendingSnapPoint = pendingSwipeCloseSnapPointRef.current;
if (pendingSnapPoint !== void 0) {
setActiveSnapPoint(pendingSnapPoint, createChangeEventDetails(reason_parts_exports.swipe, savedEvent));
}
pendingSwipeCloseSnapPointRef.current = void 0;
clearSwipeRelease();
resetSwipeRef.current?.();
} else {
pendingSwipeCloseSnapPointRef.current = void 0;
}
});
return;
}
pendingSwipeCloseSnapPointRef.current = void 0;
setSwipeDismissed(true);
}
});
const swipePointerProps = swipe2.getPointerProps();
const swipeTouchProps = swipe2.getTouchProps();
const {
moveNative: moveSwipeNative,
reset: resetSwipe
} = swipe2;
resetSwipeRef.current = resetSwipe;
React162.useEffect(() => {
const rootElement = viewportElement ?? popupElementState;
if (!rootElement) {
return void 0;
}
const resolvedRootElement = rootElement;
const doc = ownerDocument(resolvedRootElement);
function processTouchMove(event, touchState, touch) {
const drawerAxisDelta = isVerticalScrollAxis ? touch.clientY - touchState.lastY : touch.clientX - touchState.lastX;
if (event.touches.length === 2) {
return;
}
const allowTouchMove = shouldIgnoreSwipeForTextSelection(doc, resolvedRootElement);
if (allowTouchMove || !open7 || !mounted || nestedDrawerOpen2) {
return;
}
if (shouldYieldTouchMove(touchState, event, touch, isVerticalScrollAxis)) {
return;
}
const scrollTarget = touchState.scrollTarget;
if (!scrollTarget || scrollTarget === doc.documentElement || scrollTarget === doc.body) {
if (event.cancelable) {
event.preventDefault();
}
event.stopPropagation();
moveSwipeNative(event, resolvedRootElement);
return;
}
if (!hasScrollableContentOnAxis(scrollTarget, scrollAxis)) {
if (event.cancelable) {
event.preventDefault();
}
event.stopPropagation();
return;
}
if (drawerAxisDelta !== 0) {
const canSwipeFromScrollEdge = canSwipeFromScrollEdgeOnMove(scrollTarget, scrollAxis, swipeDirection3, drawerAxisDelta);
if (!touchState.allowSwipe) {
if (event.cancelable && canSwipeFromScrollEdge) {
touchState.allowSwipe = true;
event.preventDefault();
} else {
touchState.allowSwipe = false;
}
} else if (event.cancelable) {
event.preventDefault();
}
}
if (touchState.allowSwipe === true) {
event.stopPropagation();
moveSwipeNative(event, resolvedRootElement);
}
}
function handleNativeTouchMove(event) {
virtualKeyboard?.onTouchMove(event);
if (ignoreTouchSwipeRef.current) {
return;
}
const touchState = touchScrollStateRef.current;
const touch = event.touches[0];
if (!touch || !touchState) {
return;
}
processTouchMove(event, touchState, touch);
updateTouchScrollPosition(touchState, touch);
}
return addEventListener(doc, "touchmove", handleNativeTouchMove, {
passive: false,
capture: true
});
}, [mounted, nestedDrawerOpen2, open7, popupElementState, isVerticalScrollAxis, scrollAxis, swipeDirection3, moveSwipeNative, viewportElement, virtualKeyboard]);
useIsoLayoutEffect(() => {
if (!snapPointRange || swipe2.swiping) {
return;
}
applySwipeProgress(!open7 || nested ? 0 : snapPointProgress ?? 0, true, false);
}, [applySwipeProgress, frontmostHeight2, nested, notifyParentSwipeProgressChange, open7, snapPointProgress, snapPointRange, swipe2.swiping, store, visualStateStore]);
useIsoLayoutEffect(() => {
if (!notifyParentSwipeProgressChange) {
return void 0;
}
if (!open7) {
notifyParentSwipeProgressChange(0);
}
return () => {
notifyParentSwipeProgressChange(0);
};
}, [notifyParentSwipeProgressChange, open7]);
useIsoLayoutEffect(() => {
if (open7) {
if (!swipeAreaActiveRef.current) {
resetSwipe();
}
clearSwipeRelease();
}
}, [clearSwipeRelease, open7, resetSwipe, swipeAreaActiveRef]);
useIsoLayoutEffect(() => {
const backdropElement = backdropRef.current;
return () => {
visualStateStore?.set({
swipeProgress: 0,
frontmostHeight: 0
});
setBackdropSwipingAttribute(backdropElement, false);
const currentBackdrop = backdropRef.current;
if (currentBackdrop !== backdropElement) {
setBackdropSwipingAttribute(currentBackdrop, false);
}
finishNestedSwipe();
};
}, [backdropRef, finishNestedSwipe, visualStateStore]);
const swipeProviderValue = React162.useMemo(() => ({
swiping: swipe2.swiping,
getDragStyles: swipe2.getDragStyles,
swipeStrength: swipeRelease ?? null,
setSwipeDismissed
}), [setSwipeDismissed, swipe2.getDragStyles, swipe2.swiping, swipeRelease]);
function resetTouchSwipeState(ignoreSwipe) {
ignoreTouchSwipeRef.current = ignoreSwipe;
touchScrollStateRef.current = null;
}
function resetTouchTrackingState() {
resetTouchSwipeState(false);
lastPointerTypeRef.current = "";
ignoreNextTouchStartFromPenRef.current = false;
}
function handlePointerEnd(event) {
lastPointerTypeRef.current = "";
return event.pointerType !== "touch";
}
return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(DialogViewport, {
ref: forwardedRef,
className,
style,
render: render4,
...mergeProps(elementProps, {
onPointerDown(event) {
lastPointerTypeRef.current = event.pointerType;
ignoreNextTouchStartFromPenRef.current = event.pointerType === "pen";
if (!open7 || !mounted || nestedDrawerOpen2) {
return;
}
const elementAtPoint = getElementAtPoint(event.currentTarget.getRootNode(), event.clientX, event.clientY);
if (isSwipeIgnoredTarget(elementAtPoint) || isDrawerContentTarget(elementAtPoint)) {
return;
}
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerDown?.(event);
},
onPointerMove(event) {
if (event.pointerType === "touch") {
return;
}
swipePointerProps.onPointerMove?.(event);
},
onPointerUp(event) {
if (handlePointerEnd(event)) {
swipePointerProps.onPointerUp?.(event);
}
},
onPointerCancel(event) {
if (handlePointerEnd(event)) {
swipePointerProps.onPointerCancel?.(event);
}
},
onTouchStart(event) {
const startedFromPenPointerDown = lastPointerTypeRef.current === "pen" && ignoreNextTouchStartFromPenRef.current;
if (startedFromPenPointerDown) {
ignoreNextTouchStartFromPenRef.current = false;
resetTouchSwipeState(false);
return;
}
if (!open7 || !mounted || nestedDrawerOpen2) {
resetTouchSwipeState(false);
return;
}
const touch = event.touches[0];
if (!touch) {
return;
}
if (isReactTouchEventOnRangeInput(event)) {
resetTouchSwipeState(false);
return;
}
const rootElement = event.currentTarget;
const elementAtPoint = getElementAtPoint(rootElement.getRootNode(), touch.clientX, touch.clientY);
const eventTarget = getTarget(event.nativeEvent);
const target = isElement(eventTarget) ? eventTarget : rootElement;
if (!contains(rootElement, target)) {
resetTouchSwipeState(true);
return;
}
virtualKeyboard?.onTouchStart(event);
if (isSwipeIgnoredTarget(elementAtPoint)) {
resetTouchSwipeState(true);
return;
}
ignoreTouchSwipeRef.current = false;
const scrollTarget = findScrollableTouchTarget(target, rootElement, scrollAxis);
const hasCrossAxisScrollableContent = findScrollableTouchTarget(target, rootElement, crossScrollAxis) != null;
let allowSwipe = null;
if (scrollTarget) {
const canSwipeFromEdge = isAtSwipeStartEdge(scrollTarget, scrollAxis, swipeDirection3);
allowSwipe = canSwipeFromEdge ? null : false;
}
touchScrollStateRef.current = {
startX: touch.clientX,
startY: touch.clientY,
lastX: touch.clientX,
lastY: touch.clientY,
scrollTarget,
hasCrossAxisScrollableContent,
allowSwipe,
preserveNativeCrossAxisScroll: false,
drawerAxisAttributed: false
};
swipeTouchProps.onTouchStart?.(event);
},
onTouchEnd(event) {
virtualKeyboard?.onTouchEnd(event);
resetTouchTrackingState();
swipeTouchProps.onTouchEnd?.(event);
},
onTouchCancel(event) {
virtualKeyboard?.onTouchCancel();
resetTouchTrackingState();
swipeTouchProps.onTouchCancel?.(event);
},
// Drawer popups use drawer-specific nested state attributes.
// Suppress DialogViewport's generic nested dialog attribute.
[nestedDialogOpen2]: void 0
}),
children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(DrawerViewportContext.Provider, {
value: swipeProviderValue,
children
})
});
});
if (true) DrawerViewport.displayName = "DrawerViewport";
function setBackdropSwipingAttribute(backdropElement, swiping3) {
backdropElement?.toggleAttribute(swiping, swiping3);
}
function isSwipeIgnoredTarget(target) {
return Boolean(target?.closest(BASE_UI_SWIPE_IGNORE_SELECTOR));
}
function isDrawerContentTarget(target) {
return Boolean(target?.closest(DRAWER_CONTENT_SELECTOR));
}
function getBaseSwipeSize(element, direction) {
return direction === "left" || direction === "right" ? element.offsetWidth : element.offsetHeight;
}
function getBaseSwipeThreshold(element, direction) {
return Math.max(getBaseSwipeSize(element, direction) * 0.5, MIN_SWIPE_THRESHOLD);
}
function isRangeInput(target, win) {
return target instanceof win.HTMLInputElement && target.type === "range";
}
function isTextSelectionControl(target) {
return target.tagName === "INPUT" || target.tagName === "TEXTAREA";
}
function hasExpandedSelectionWithinTarget(selection, target) {
const anchorElement = isElement(selection.anchorNode) ? selection.anchorNode : selection.anchorNode?.parentElement;
const focusElement = isElement(selection.focusNode) ? selection.focusNode : selection.focusNode?.parentElement;
return selection.containsNode(target, true) || contains(target, anchorElement) || contains(target, focusElement);
}
function shouldIgnoreSwipeForTextSelection(doc, rootElement) {
const activeEl = activeElement(doc);
if (activeEl && contains(rootElement, activeEl) && isTextSelectionControl(activeEl)) {
const {
selectionStart,
selectionEnd
} = activeEl;
if (selectionStart != null && selectionEnd != null && selectionStart < selectionEnd) {
return true;
}
}
const selection = doc.getSelection?.();
if (!selection || selection.isCollapsed) {
return false;
}
return hasExpandedSelectionWithinTarget(selection, rootElement);
}
function isEventOnRangeInput(event, win) {
return event.composedPath().some((pathTarget) => isRangeInput(pathTarget, win));
}
function isReactTouchEventOnRangeInput(event) {
return isEventOnRangeInput(event.nativeEvent, getWindow(event.currentTarget));
}
function updateTouchScrollPosition(touchState, touch) {
touchState.lastX = touch.clientX;
touchState.lastY = touch.clientY;
}
function shouldYieldTouchMove(touchState, event, touch, isVerticalScrollAxis) {
if (touchState.preserveNativeCrossAxisScroll) {
return true;
}
if (touchState.drawerAxisAttributed || touchState.allowSwipe === true || !touchState.hasCrossAxisScrollableContent) {
return false;
}
if (!event.cancelable) {
touchState.preserveNativeCrossAxisScroll = true;
return true;
}
const drawerAxisGestureDelta = isVerticalScrollAxis ? touch.clientY - touchState.startY : touch.clientX - touchState.startX;
const crossAxisGestureDelta = isVerticalScrollAxis ? touch.clientX - touchState.startX : touch.clientY - touchState.startY;
const absDrawerAxisGestureDelta = Math.abs(drawerAxisGestureDelta);
const absCrossAxisGestureDelta = Math.abs(crossAxisGestureDelta);
if (absCrossAxisGestureDelta >= AXIS_LOCK_SLOP && absCrossAxisGestureDelta > absDrawerAxisGestureDelta + AXIS_LOCK_BIAS) {
touchState.preserveNativeCrossAxisScroll = true;
return true;
}
if (absDrawerAxisGestureDelta >= AXIS_LOCK_SLOP) {
touchState.drawerAxisAttributed = true;
return false;
}
return true;
}
function hasScrollableContentOnAxis(scrollTarget, axis) {
return getScrollMetrics(scrollTarget, axis).max > 0;
}
function getScrollMetrics(scrollTarget, axis) {
if (axis === "vertical") {
const max4 = Math.max(0, scrollTarget.scrollHeight - scrollTarget.clientHeight);
return {
offset: scrollTarget.scrollTop,
max: max4
};
}
const max3 = Math.max(0, scrollTarget.scrollWidth - scrollTarget.clientWidth);
return {
offset: scrollTarget.scrollLeft,
max: max3
};
}
function isAtSwipeStartEdge(scrollTarget, axis, direction) {
const dismissFromStartEdge = shouldDismissFromStartEdge(direction, axis);
const {
offset: offset4,
max: max3
} = getScrollMetrics(scrollTarget, axis);
return dismissFromStartEdge ? offset4 <= 0 : offset4 >= max3;
}
function canSwipeFromScrollEdgeOnMove(scrollTarget, axis, direction, delta) {
const dismissFromStartEdge = shouldDismissFromStartEdge(direction, axis);
const movingTowardDismiss = dismissFromStartEdge ? delta > 0 : delta < 0;
if (!movingTowardDismiss) {
return false;
}
return isAtSwipeStartEdge(scrollTarget, axis, direction);
}
function shouldDismissFromStartEdge(direction, axis) {
return axis === "vertical" ? direction === "down" : direction === "right";
}
// node_modules/@base-ui/react/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardProvider.mjs
var React163 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/drawer/viewport/DrawerViewportCssVars.mjs
var keyboardInset = "--drawer-keyboard-inset";
// node_modules/@base-ui/react/drawer/virtual-keyboard-provider/DrawerVirtualKeyboardProvider.mjs
var import_jsx_runtime43 = __toESM(require_jsx_runtime(), 1);
var KEYBOARD_RESIZE_THRESHOLD = 60;
var KEYBOARD_VISIBILITY_MARGIN = 16;
var KEYBOARD_SCROLL_SLACK = 48;
var KEYBOARD_REALIGN_INTERVAL = 150;
var KEYBOARD_REALIGN_MAX_PASSES = 4;
var KEYBOARD_SETTLE_FRAME_LIMIT = 60;
var INPUT_TAP_MOVE_THRESHOLD = 10;
var INPUT_TAP_HIT_SLOP = 16;
var KEYBOARD_INPUT_TYPES = /* @__PURE__ */ new Set(["email", "number", "password", "search", "tel", "text", "url"]);
var KEYBOARD_TAP_BLOCKED = /* @__PURE__ */ Symbol("KeyboardTapBlocked");
function DrawerVirtualKeyboardProvider(props) {
const {
children
} = props;
const store = useDialogRootContext();
const open7 = store.useState("open");
const mounted = store.useState("mounted");
const modal = store.useState("modal");
const nestedOpenDialogCount = store.useState("nestedOpenDialogCount");
const viewportElement = store.useState("viewportElement");
const rootElement = viewportElement;
const nestedDrawerOpen2 = nestedOpenDialogCount > 0;
const pendingKeyboardFocusMovedRef = React163.useRef(false);
const keyboardTouchStartRef = React163.useRef(null);
const focusedKeyboardTargetRef = React163.useRef(null);
const keyboardScrollAdjustmentRef = React163.useRef(null);
const programmaticKeyboardFocusRef = React163.useRef(false);
const keyboardFocusFrame = useAnimationFrame();
const keyboardRealignTimeout = useTimeout();
const restoreKeyboardScrollAdjustment = useStableCallback(() => {
const adjustment = keyboardScrollAdjustmentRef.current;
if (!adjustment) {
return;
}
adjustment.element.style.overflowAnchor = adjustment.overflowAnchor;
adjustment.element.style.paddingBottom = adjustment.paddingBottom;
adjustment.element.style.scrollPaddingBottom = adjustment.scrollPaddingBottom;
keyboardScrollAdjustmentRef.current = null;
});
const setKeyboardScrollSlack = useStableCallback((element, slack) => {
const roundedSlack = Math.max(0, Math.ceil(slack));
let adjustment = keyboardScrollAdjustmentRef.current;
if (adjustment && !adjustment.element.isConnected) {
restoreKeyboardScrollAdjustment();
adjustment = null;
}
if (roundedSlack === 0) {
restoreKeyboardScrollAdjustment();
return;
}
if (adjustment && adjustment.element !== element) {
restoreKeyboardScrollAdjustment();
adjustment = null;
}
if (!adjustment) {
const styles = getComputedStyle2(element);
adjustment = {
element,
overflowAnchor: element.style.overflowAnchor,
paddingBottom: element.style.paddingBottom,
scrollPaddingBottom: element.style.scrollPaddingBottom,
computedPaddingBottom: Number.parseFloat(styles.paddingBottom) || 0,
computedScrollPaddingBottom: Number.parseFloat(styles.scrollPaddingBottom) || 0
};
keyboardScrollAdjustmentRef.current = adjustment;
}
element.style.overflowAnchor = "none";
element.style.paddingBottom = `${adjustment.computedPaddingBottom + roundedSlack}px`;
element.style.scrollPaddingBottom = `${adjustment.computedScrollPaddingBottom + KEYBOARD_VISIBILITY_MARGIN}px`;
});
const animateKeyboardScroll = useStableCallback((element, scrollTop) => {
const win = getWindow(element);
const behavior = win.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches ? "auto" : "smooth";
element.scrollTo({
top: scrollTop,
behavior
});
});
const resetTouchTrackingState = useStableCallback(() => {
pendingKeyboardFocusMovedRef.current = false;
keyboardTouchStartRef.current = null;
});
React163.useEffect(() => {
if (!mounted || !open7) {
focusedKeyboardTargetRef.current = null;
restoreKeyboardScrollAdjustment();
keyboardFocusFrame.cancel();
return void 0;
}
if (!rootElement) {
restoreKeyboardScrollAdjustment();
return void 0;
}
const doc = ownerDocument(rootElement);
const win = getWindow(rootElement);
const visualViewport = win.visualViewport;
let keyboardScrollElement = null;
let keyboardScrollDestination = 0;
let keyboardScrollChecks = 0;
let keyboardScrollObserved = -1;
const setDrawerKeyboardInset = (inset) => {
rootElement.style.setProperty(keyboardInset, `${Math.max(0, Math.ceil(inset))}px`);
};
const clearFocusedKeyboardTarget = () => {
focusedKeyboardTargetRef.current = null;
keyboardScrollElement = null;
setDrawerKeyboardInset(0);
restoreKeyboardScrollAdjustment();
keyboardFocusFrame.cancel();
keyboardRealignTimeout.clear();
};
const baseScrollX = win.scrollX;
const baseScrollY = win.scrollY;
const restoreWindowScroll = () => {
if (modal !== true || nestedDrawerOpen2 || !focusedKeyboardTargetRef.current || getKeyboardVisualViewport(win) == null) {
return false;
}
if (win.scrollX !== baseScrollX || win.scrollY !== baseScrollY) {
win.scrollTo({
left: baseScrollX,
top: baseScrollY,
behavior: "instant"
});
return true;
}
return false;
};
let restorePreemptedFocus = null;
const consumePreemptedFocus = () => {
restorePreemptedFocus?.();
restorePreemptedFocus = null;
};
const preemptFocusReveal = (target, keyboardViewport) => {
consumePreemptedFocus();
const rect = target.getBoundingClientRect();
restorePreemptedFocus = overrideGeometryDuringFocus(target, (keyboardViewport.top + keyboardViewport.bottom - rect.top - rect.bottom) / 2);
};
const alignFocusedKeyboardTarget = () => {
consumePreemptedFocus();
const target = focusedKeyboardTargetRef.current;
if (nestedDrawerOpen2 || !target || !contains(rootElement, target)) {
setDrawerKeyboardInset(0);
restoreKeyboardScrollAdjustment();
return;
}
restoreWindowScroll();
const keyboardViewport = getKeyboardVisualViewport(win);
if (!keyboardViewport) {
setDrawerKeyboardInset(0);
restoreKeyboardScrollAdjustment();
return;
}
setDrawerKeyboardInset(Math.max(0, win.innerHeight - keyboardViewport.bottom));
const scrollTarget = findKeyboardScrollTarget(target, rootElement);
if (!scrollTarget) {
restoreKeyboardScrollAdjustment();
return;
}
const scrollTargetRect = scrollTarget.getBoundingClientRect();
const clippedBottom = Math.min(scrollTargetRect.bottom, keyboardViewport.bottom);
const overlap = Math.max(0, scrollTargetRect.bottom - keyboardViewport.bottom);
setKeyboardScrollSlack(scrollTarget, overlap > 0 ? overlap + KEYBOARD_SCROLL_SLACK : 0);
const maxScrollTop = Math.max(0, scrollTarget.scrollHeight - scrollTarget.clientHeight);
if (maxScrollTop <= 0) {
return;
}
const clippedTop = Math.max(scrollTargetRect.top, keyboardViewport.top);
const visibleTop = clippedTop + KEYBOARD_VISIBILITY_MARGIN;
const visibleBottom = clippedBottom - KEYBOARD_VISIBILITY_MARGIN;
if (visibleBottom <= visibleTop) {
return;
}
const targetRect = target.getBoundingClientRect();
const nextScrollTop = scrollTarget.scrollTop + (targetRect.top + targetRect.bottom - visibleTop - visibleBottom) / 2;
const destination = Math.round(clamp2(nextScrollTop, 0, maxScrollTop));
const settled = keyboardScrollElement === scrollTarget && Math.abs(keyboardScrollDestination - destination) <= 1;
if (!settled) {
const checks = keyboardScrollElement === scrollTarget ? keyboardScrollChecks + 1 : 1;
keyboardScrollElement = scrollTarget;
keyboardScrollDestination = destination;
keyboardScrollChecks = checks;
keyboardScrollObserved = -1;
if (checks <= KEYBOARD_SETTLE_FRAME_LIMIT) {
keyboardFocusFrame.request(alignFocusedKeyboardTarget);
return;
}
} else if (keyboardScrollObserved >= 0) {
const current = scrollTarget.scrollTop;
if (Math.abs(current - destination) <= 1) {
return;
}
if (current !== keyboardScrollObserved) {
keyboardScrollObserved = current;
return;
}
}
keyboardScrollElement = scrollTarget;
keyboardScrollDestination = destination;
keyboardScrollChecks = 0;
keyboardScrollObserved = scrollTarget.scrollTop;
animateKeyboardScroll(scrollTarget, destination);
};
const scheduleKeyboardFocusAlignment = () => {
keyboardFocusFrame.request(alignFocusedKeyboardTarget);
};
const scheduleDelayedKeyboardRealign = () => {
let remainingPasses = KEYBOARD_REALIGN_MAX_PASSES;
const realign = () => {
alignFocusedKeyboardTarget();
remainingPasses -= 1;
if (remainingPasses > 0) {
keyboardRealignTimeout.start(KEYBOARD_REALIGN_INTERVAL, realign);
}
};
keyboardRealignTimeout.start(KEYBOARD_REALIGN_INTERVAL, realign);
};
const captureFocusedKeyboardTarget = (eventTarget) => {
if (nestedDrawerOpen2) {
return false;
}
const target = resolveKeyboardInputTarget(eventTarget);
if (!target || !contains(rootElement, target)) {
return false;
}
if (focusedKeyboardTargetRef.current !== target) {
keyboardScrollElement = null;
}
focusedKeyboardTargetRef.current = target;
return true;
};
const handleFocusIn = (event) => {
programmaticKeyboardFocusRef.current = false;
consumePreemptedFocus();
if (!captureFocusedKeyboardTarget(getTarget(event))) {
clearFocusedKeyboardTarget();
return;
}
if (getKeyboardVisualViewport(win) != null) {
scheduleDelayedKeyboardRealign();
}
scheduleKeyboardFocusAlignment();
};
const handleFocusOut = (event) => {
if (programmaticKeyboardFocusRef.current) {
return;
}
if (captureFocusedKeyboardTarget(event.relatedTarget)) {
const target = focusedKeyboardTargetRef.current;
const keyboardViewport = getKeyboardVisualViewport(win);
if (target && keyboardViewport) {
preemptFocusReveal(target, keyboardViewport);
}
scheduleKeyboardFocusAlignment();
return;
}
clearFocusedKeyboardTarget();
};
const handleViewportUpdate = () => {
if (focusedKeyboardTargetRef.current || captureFocusedKeyboardTarget(activeElement(doc))) {
scheduleKeyboardFocusAlignment();
}
};
const cleanupListeners = [];
if (visualViewport) {
cleanupListeners.push(addEventListener(visualViewport, "resize", handleViewportUpdate), addEventListener(visualViewport, "scroll", handleViewportUpdate));
}
const handleWindowScroll = () => {
if (restoreWindowScroll()) {
scheduleKeyboardFocusAlignment();
}
};
const cancelKeyboardRealignOnPointerDown = () => {
keyboardFocusFrame.cancel();
keyboardRealignTimeout.clear();
keyboardScrollElement = null;
};
cleanupListeners.push(addEventListener(doc, "focusin", handleFocusIn, true), addEventListener(doc, "focusout", handleFocusOut, true), addEventListener(win, "scroll", handleWindowScroll), addEventListener(doc, "pointerdown", cancelKeyboardRealignOnPointerDown, true));
if (captureFocusedKeyboardTarget(activeElement(doc))) {
scheduleKeyboardFocusAlignment();
}
return () => {
cleanupListeners.forEach((cleanup) => cleanup());
consumePreemptedFocus();
clearFocusedKeyboardTarget();
rootElement.style.removeProperty(keyboardInset);
};
}, [animateKeyboardScroll, keyboardFocusFrame, keyboardRealignTimeout, modal, mounted, nestedDrawerOpen2, open7, restoreKeyboardScrollAdjustment, rootElement, setKeyboardScrollSlack]);
const onTouchStart = useStableCallback((event) => {
const touch = event.touches[0];
pendingKeyboardFocusMovedRef.current = false;
keyboardTouchStartRef.current = {
x: touch.clientX,
y: touch.clientY
};
});
const onTouchMove = useStableCallback((event) => {
const touch = event.touches[0];
const touchStart = keyboardTouchStartRef.current;
if (!touch || !touchStart || pendingKeyboardFocusMovedRef.current) {
return;
}
if (Math.abs(touch.clientX - touchStart.x) > INPUT_TAP_MOVE_THRESHOLD || Math.abs(touch.clientY - touchStart.y) > INPUT_TAP_MOVE_THRESHOLD) {
pendingKeyboardFocusMovedRef.current = true;
}
});
const onTouchEnd = useStableCallback((event) => {
if (!open7 || !mounted || nestedDrawerOpen2 || !rootElement || !keyboardTouchStartRef.current || pendingKeyboardFocusMovedRef.current) {
resetTouchTrackingState();
return;
}
const touch = event.changedTouches[0] ?? event.touches[0];
const root = rootElement.getRootNode();
const nativeEventTarget = getTarget(event.nativeEvent);
const pointTarget = touch ? resolveKeyboardTouchTargetFromPoint(root, touch.clientX, touch.clientY) : null;
if (pointTarget === KEYBOARD_TAP_BLOCKED) {
resetTouchTrackingState();
return;
}
const keyboardTarget = touch && (pointTarget ?? resolveKeyboardTouchTarget(nativeEventTarget));
if (keyboardTarget && (!contains(rootElement, keyboardTarget.focusTarget) || !contains(rootElement, keyboardTarget.clickTarget))) {
resetTouchTrackingState();
return;
}
if (keyboardTarget) {
const {
clickTarget: keyboardClickTarget,
focusTarget: keyboardFocusTarget
} = keyboardTarget;
const win = getWindow(keyboardFocusTarget);
if (win.visualViewport && win.visualViewport.scale !== 1) {
resetTouchTrackingState();
return;
}
if (activeElement(ownerDocument(keyboardFocusTarget)) === keyboardFocusTarget && (!win.visualViewport || getKeyboardVisualViewport(win) != null)) {
resetTouchTrackingState();
return;
}
event.preventDefault();
programmaticKeyboardFocusRef.current = true;
try {
focusKeyboardInputWithoutPageScroll(keyboardFocusTarget);
} finally {
programmaticKeyboardFocusRef.current = false;
}
dispatchKeyboardClick(keyboardClickTarget, touch);
resetTouchTrackingState();
return;
}
resetTouchTrackingState();
});
const contextValue = React163.useMemo(() => ({
onTouchStart,
onTouchMove,
onTouchEnd,
onTouchCancel: resetTouchTrackingState
}), [onTouchEnd, onTouchMove, onTouchStart, resetTouchTrackingState]);
return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(DrawerVirtualKeyboardContext.Provider, {
value: contextValue,
children
});
}
function isKeyboardInputElement(element) {
if (element.isContentEditable) {
return true;
}
const win = getWindow(element);
if (element instanceof win.HTMLTextAreaElement || element instanceof win.HTMLInputElement && KEYBOARD_INPUT_TYPES.has(element.type)) {
return !element.matches(":disabled");
}
return false;
}
function resolveKeyboardInputTarget(target) {
if (!isHTMLElement(target)) {
return null;
}
if (isKeyboardInputElement(target)) {
return target.isContentEditable ? getContentEditableHost(target) : target;
}
const label = target.closest("label");
const control = label?.control ?? null;
return isHTMLElement(control) && isKeyboardInputElement(control) ? control : null;
}
function resolveKeyboardTouchTarget(target) {
if (!isHTMLElement(target)) {
return null;
}
const focusTarget = resolveKeyboardInputTarget(target);
if (!focusTarget) {
return null;
}
return {
focusTarget,
clickTarget: target
};
}
function getContentEditableHost(element) {
let host = element;
while (host.parentElement?.isContentEditable) {
host = host.parentElement;
}
return host;
}
function resolveKeyboardTouchTargetFromPoint(root, clientX, clientY) {
const exactTarget = getElementAtPoint(root, clientX, clientY);
if (isHTMLElement(exactTarget)) {
const exactKeyboardTarget = resolveKeyboardInputTarget(exactTarget);
if (exactKeyboardTarget) {
return {
focusTarget: exactKeyboardTarget,
clickTarget: exactTarget
};
}
}
if (isInteractiveElement(exactTarget) || exactTarget?.closest("label") != null) {
return KEYBOARD_TAP_BLOCKED;
}
for (const [offsetX, offsetY] of [[0, INPUT_TAP_HIT_SLOP], [0, -INPUT_TAP_HIT_SLOP], [INPUT_TAP_HIT_SLOP, 0], [-INPUT_TAP_HIT_SLOP, 0]]) {
const keyboardTarget = resolveKeyboardInputTarget(getElementAtPoint(root, clientX + offsetX, clientY + offsetY));
if (keyboardTarget) {
return {
focusTarget: keyboardTarget,
clickTarget: keyboardTarget
};
}
}
return null;
}
function dispatchKeyboardClick(target, touch) {
const win = getWindow(target);
const ClickEvent = win.PointerEvent ?? win.MouseEvent;
target.dispatchEvent(new ClickEvent("click", {
bubbles: true,
cancelable: true,
clientX: touch.clientX,
clientY: touch.clientY,
detail: 1,
view: win
}));
}
function focusKeyboardInputWithoutPageScroll(target) {
const wasFocused = activeElement(ownerDocument(target)) === target;
const restoreStyles = overrideGeometryDuringFocus(target, -2e3);
try {
if (wasFocused) {
target.blur();
}
target.focus({
preventScroll: true
});
} finally {
restoreStyles();
}
}
function overrideGeometryDuringFocus(target, translateY) {
const previousOpacity = target.style.opacity;
const previousTransform = target.style.transform;
const previousTransition = target.style.transition;
target.style.transition = "none";
target.style.opacity = "0";
target.style.transform = `translateY(${translateY}px)`;
return () => {
target.style.opacity = previousOpacity;
target.style.transform = previousTransform;
target.style.transition = previousTransition;
};
}
function findKeyboardScrollTarget(target, root) {
const scrollStart = getParentNode(target);
return findScrollableTouchTarget(scrollStart, root, "vertical") ?? findScrollableTouchTarget(scrollStart, root, "vertical", true);
}
function getKeyboardVisualViewport(win) {
const visualViewport = win.visualViewport;
if (!visualViewport || visualViewport.scale !== 1) {
return null;
}
const reducedHeight = win.innerHeight - visualViewport.height;
if (reducedHeight <= KEYBOARD_RESIZE_THRESHOLD) {
return null;
}
const top = Math.max(0, visualViewport.offsetTop);
return {
top,
bottom: Math.min(win.innerHeight, top + visualViewport.height)
};
}
// node_modules/@base-ui/react/drawer/handle.mjs
var DrawerHandle = class extends DialogHandle {
};
function createDrawerHandle() {
return new DrawerHandle();
}
// node_modules/@base-ui/react/field/index.parts.mjs
var index_parts_exports7 = {};
__export(index_parts_exports7, {
Control: () => FieldControl,
Description: () => FieldDescription,
Error: () => FieldError,
Item: () => FieldItem,
Label: () => FieldLabel,
Root: () => FieldRoot,
Validity: () => FieldValidity
});
// node_modules/@base-ui/react/field/root/FieldRoot.mjs
var React167 = __toESM(require_react(), 1);
// node_modules/@base-ui/react/fieldset/root/FieldsetRootContext.mjs
var React164 = __toESM(require_react(), 1);
var FieldsetRootContext = /* @__PURE__ */ React164.createContext(void 0);
if (true) FieldsetRootContext.displayName = "FieldsetRootContext";
function useFieldsetRootContext(optional = false) {
const context = React164.useContext(FieldsetRootContext);
if (!context && !optional) {
throw new Error(true ? "Base UI: FieldsetRootContext is missing. Fieldset parts must be placed within ." : formatErrorMessage_default(86));
}
return context;
}
// node_modules/@base-ui/react/internals/labelable-provider/LabelableProvider.mjs
var React165 = __toESM(require_react(), 1);
var import_jsx_runtime44 = __toESM(require_jsx_runtime(), 1);
var LabelableProvider = function LabelableProvider2(props) {
const defaultId = useBaseUiId();
const [controlIdState, setControlIdState] = React165.useState(defaultId);
const [labelId, setLabelId] = React165.useState();
const [messageIds, setMessageIds] = React165.useState([]);
const controlId = controlIdState === void 0 ? defaultId : controlIdState;
const registrationsRef = useRefWithInit(() => /* @__PURE__ */ new Map());
const {
messageIds: parentMessageIds
} = useLabelableContext();
const registerControlId = useStableCallback((source, nextId) => {
const registrations = registrationsRef.current;
if (nextId === void 0) {
registrations.delete(source);
} else {
registrations.set(source, nextId);
}
setControlIdState((prev) => {
if (registrations.size === 0) {
return prev;
}
let nextControlId;
for (const id of registrations.values()) {
if (id === prev) {
return prev;
}
if (nextControlId === void 0) {
nextControlId = id;
}
}
return nextControlId;
});
});
const resetControlId = useStableCallback(() => {
if (registrationsRef.current.size === 0) {
setControlIdState(defaultId);
}
});
const getDescriptionProps = React165.useCallback((externalProps) => {
const ids2 = externalProps["aria-describedby"] ? externalProps["aria-describedby"].split(" ") : [];
ids2.push(...parentMessageIds, ...messageIds);
return {
...externalProps,
"aria-describedby": Array.from(new Set(ids2)).join(" ") || void 0
};
}, [parentMessageIds, messageIds]);
const contextValue = React165.useMemo(() => ({
controlId,
registerControlId,
resetControlId,
labelId,
setLabelId,
messageIds,
setMessageIds,
getDescriptionProps
}), [controlId, registerControlId, resetControlId, labelId, setLabelId, messageIds, setMessageIds, getDescriptionProps]);
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(LabelableContext.Provider, {
value: contextValue,
children: props.children
});
};
if (true) LabelableProvider.displayName = "LabelableProvider";
// node_modules/@base-ui/react/internals/field-register-control/useFieldControlRegistration.mjs
var React166 = __toESM(require_react(), 1);
function useFieldControlRegistration(params) {
const {
change,
commit,
invalid: invalid2,
markedDirtyRef,
name,
setRegisteredFieldName,
registeredFieldIdRef,
setValidityData,
validityData
} = params;
const {
formRef
} = useFormContext();
const activeFieldControlSourceRef = React166.useRef(null);
const registrationRef = React166.useRef(null);
const initialValueCapturedRef = React166.useRef(false);
const getValueForForm = useStableCallback(() => {
const registration = registrationRef.current;
if (!registration) {
return void 0;
}
if (registration.getValue) {
return registration.getValue();
}
return registration.value;
});
function getRegistrationValue(registration) {
return registration.value === void 0 ? getValueForForm() : registration.value;
}
const validate = useStableCallback(() => {
const registration = registrationRef.current;
markedDirtyRef.current = true;
if (!registration) {
commit(validityData.value);
return;
}
commit(getRegistrationValue(registration));
});
function refreshRegistration() {
const registration = registrationRef.current;
if (!registration || !registration.id) {
return;
}
formRef.current.fields.set(registration.id, {
getValue: getValueForForm,
name: name ?? registration.name,
controlRef: registration.controlRef,
validityData: getCombinedFieldValidityData(validityData, invalid2),
validate
});
}
function deleteRegistration(id = registrationRef.current?.id) {
if (id) {
formRef.current.fields.delete(id);
}
}
function captureInitialValue(registration) {
if (initialValueCapturedRef.current) {
return;
}
initialValueCapturedRef.current = true;
const initialValue = getRegistrationValue(registration);
setValidityData((prev) => prev.initialValue === initialValue ? prev : {
...prev,
initialValue
});
}
useIsoLayoutEffect(() => {
const registration = registrationRef.current;
if (!registration || !registration.id) {
return;
}
setRegisteredFieldName(name ? void 0 : registration.name);
formRef.current.fields.set(registration.id, {
getValue: getValueForForm,
name: name ?? registration.name,
controlRef: registration.controlRef,
validityData: getCombinedFieldValidityData(validityData, invalid2),
validate
});
}, [formRef, getValueForForm, invalid2, name, setRegisteredFieldName, validate, validityData]);
useIsoLayoutEffect(() => {
const fields2 = formRef.current.fields;
return () => {
const id = registrationRef.current?.id;
if (id) {
fields2.delete(id);
}
};
}, [formRef]);
const register2 = useStableCallback((source, registration) => {
if (!registration) {
if (activeFieldControlSourceRef.current === source) {
activeFieldControlSourceRef.current = null;
change(void 0, true);
deleteRegistration();
registrationRef.current = null;
setRegisteredFieldName(void 0);
registeredFieldIdRef.current = void 0;
}
return;
}
const previousId = registrationRef.current?.id;
const previousSource = activeFieldControlSourceRef.current;
if (previousSource && previousSource !== source) {
change(void 0, true);
}
activeFieldControlSourceRef.current = source;
registrationRef.current = registration;
if (!name) {
setRegisteredFieldName(registration.name);
}
registeredFieldIdRef.current = registration.id;
if (previousId && previousId !== registration.id) {
deleteRegistration(previousId);
}
captureInitialValue(registration);
refreshRegistration();
});
return [validate, register2];
}
// node_modules/@base-ui/react/field/root/FieldRoot.mjs
var import_jsx_runtime45 = __toESM(require_jsx_runtime(), 1);
var FieldRootInner = /* @__PURE__ */ React167.forwardRef(function FieldRootInner2(componentProps, forwardedRef) {
const {
errors,
validationMode: formValidationMode,
submitCountRef
} = useFormContext();
const {
render: render4,
className,
validate: validateProp,
validationDebounceTime = 0,
validationMode = formValidationMode,
name,
disabled: disabledProp = false,
invalid: invalidProp,
dirty: dirtyProp,
touched: touchedProp,
actionsRef,
style,
...elementProps
} = componentProps;
const disabledFieldset = useFieldsetRootContext(true)?.disabled;
const validate = useStableCallback(validateProp || (() => null));
const disabled3 = disabledFieldset || disabledProp;
const [touchedState, setTouchedUnwrapped] = React167.useState(false);
const [dirtyState, setDirtyUnwrapped] = React167.useState(false);
const [filled, setFilled] = React167.useState(false);
const [focused, setFocused] = React167.useState(false);
const dirty = dirtyProp ?? dirtyState;
const touched = touchedProp ?? touchedState;
const markedDirtyRef = React167.useRef(dirty);
const registeredFieldIdRef = React167.useRef(void 0);
const [registeredFieldName, setRegisteredFieldName] = React167.useState();
const effectiveName = name ?? registeredFieldName;
useIsoLayoutEffect(() => {
if (dirtyProp !== void 0) {
markedDirtyRef.current = dirtyProp;
}
}, [dirtyProp]);
const setDirty = useStableCallback((value) => {
if (dirtyProp !== void 0) {
return;
}
if (value) {
markedDirtyRef.current = true;
}
setDirtyUnwrapped(value);
});
const setTouched = useStableCallback((value) => {
if (touchedProp !== void 0) {
return;
}
setTouchedUnwrapped(value);
});
const shouldValidateOnChange = useStableCallback(() => validationMode === "onChange" || validationMode === "onSubmit" && submitCountRef.current > 0);
const formError = effectiveName && Object.hasOwn(errors, effectiveName) ? errors[effectiveName] : null;
const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);
const invalid2 = invalidProp === true || hasFormError;
const [validityData, setValidityData] = React167.useState({
state: DEFAULT_VALIDITY_STATE,
error: "",
errors: [],
value: null,
initialValue: null
});
const valid2 = !invalid2 && (disabled3 ? null : validityData.state.valid);
const state = React167.useMemo(() => ({
disabled: disabled3,
touched,
dirty,
valid: valid2,
filled,
focused
}), [disabled3, touched, dirty, valid2, filled, focused]);
const validation = useFieldValidation({
setValidityData,
validate,
validityData,
validationDebounceTime,
invalid: invalid2,
markedDirtyRef,
state,
shouldValidateOnChange,
validationMode,
registeredFieldIdRef
});
const [validateFieldControl, registerFieldControl] = useFieldControlRegistration({
change: validation.change,
commit: validation.commit,
invalid: invalid2,
markedDirtyRef,
name,
setRegisteredFieldName,
registeredFieldIdRef,
setValidityData,
validityData
});
React167.useImperativeHandle(actionsRef, () => ({
validate: validateFieldControl
}), [validateFieldControl]);
const contextValue = React167.useMemo(() => ({
invalid: invalid2,
name: effectiveName,
validityData,
setValidityData,
disabled: disabled3,
setTouched,
setDirty,
setFilled,
setFocused,
validationMode,
shouldValidateOnChange,
state,
registerFieldControl,
validation
}), [invalid2, effectiveName, validityData, disabled3, setTouched, setDirty, setFilled, setFocused, validationMode, shouldValidateOnChange, state, registerFieldControl, validation]);
const element = useRenderElement("div", componentProps, {
ref: forwardedRef,
state,
props: elementProps,
stateAttributesMapping: fieldValidityMapping
});
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(FieldRootContext.Provider, {
value: contextValue,
children: element
});
});
if (true) FieldRootInner.displayName = "FieldRootInner";
var FieldRoot = /* @__PURE__ */ React167.forwardRef(function FieldRoot2(componentProps, forwardedRef) {
return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(LabelableProvider, {
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(FieldRootInner, {
...componentProps,
ref: forwardedRef
})
});
});
if (true) FieldRoot.displayName = "FieldRoot";
// node_modules/@base-ui/react/field/label/FieldLabel.mjs
var React168 = __toESM(require_react(), 1);
var FieldLabel = /* @__PURE__ */ React168.forwardRef(function FieldLabel2(componentProps, forwardedRef) {
const {
render: render4,
className,
style,
id: idProp,
nativeLabel = true,
...elementProps
} = componentProps;
const fieldRootContext = useFieldRootContext(false);
const fieldItemContext = useFieldItemContext();
const {
labelId
} = useLabelableContext();
const state = {
...fieldRootContext.state,
disabled: fieldRootContext.disabled || fieldItemContext.disabled
};
const labelRef = React168.useRef(null);
const labelProps = useLabel({
id: labelId ?? idProp,
native: nativeLabel
});
if (true) {
React168.useEffect(() => {
if (!labelRef.current) {
return;
}
const isLabelTag = labelRef.current.tagName === "LABEL";
if (nativeLabel) {
if (!isLabelTag) {
const ownerStackMessage = SafeReact.captureOwnerStack?.() || "";
const message2 = " expected a