UNPKG

@ariakit/core

Version:
174 lines (172 loc) 5.13 kB
"use client"; import { isSafari, isTouchDevice } from "../__chunks/QAGXQEUG.js"; import { createPopoverStore } from "../__chunks/ME2CUF3F.js"; import { createCompositeStore } from "../__chunks/2CHYBBFH.js"; import "../__chunks/7PRQYBBV.js"; import "../__chunks/FZZ2AVHF.js"; import "../__chunks/RCQ5P4YE.js"; import "../__chunks/EO4GVUA4.js"; import "../__chunks/DTR5TSDJ.js"; import { batch, createStore, mergeStore, pick, setup, sync, throwOnConflictingProps } from "../__chunks/BCALMBPZ.js"; import { chain, defaultValue } from "../__chunks/PBFD2E7P.js"; import { __objRest, __spreadProps, __spreadValues } from "../__chunks/3YLGPPWQ.js"; // src/combobox/combobox-store.ts var isTouchSafari = isSafari() && isTouchDevice(); function createComboboxStore(_a = {}) { var _b = _a, { tag } = _b, props = __objRest(_b, [ "tag" ]); const store = mergeStore(props.store, pick(tag, ["value", "rtl"])); throwOnConflictingProps(props, store); const tagState = tag == null ? void 0 : tag.getState(); const syncState = store == null ? void 0 : store.getState(); const activeId = defaultValue( props.activeId, syncState == null ? void 0 : syncState.activeId, props.defaultActiveId, null ); const composite = createCompositeStore(__spreadProps(__spreadValues({}, props), { activeId, includesBaseElement: defaultValue( props.includesBaseElement, syncState == null ? void 0 : syncState.includesBaseElement, true ), orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "vertical" ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true), focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true), virtualFocus: defaultValue( props.virtualFocus, syncState == null ? void 0 : syncState.virtualFocus, true ) })); const popover = createPopoverStore(__spreadProps(__spreadValues({}, props), { placement: defaultValue( props.placement, syncState == null ? void 0 : syncState.placement, "bottom-start" ) })); const value = defaultValue( props.value, syncState == null ? void 0 : syncState.value, props.defaultValue, "" ); const selectedValue = defaultValue( props.selectedValue, syncState == null ? void 0 : syncState.selectedValue, tagState == null ? void 0 : tagState.values, props.defaultSelectedValue, "" ); const multiSelectable = Array.isArray(selectedValue); const initialState = __spreadProps(__spreadValues(__spreadValues({}, composite.getState()), popover.getState()), { value, selectedValue, resetValueOnSelect: defaultValue( props.resetValueOnSelect, syncState == null ? void 0 : syncState.resetValueOnSelect, multiSelectable ), resetValueOnHide: defaultValue( props.resetValueOnHide, syncState == null ? void 0 : syncState.resetValueOnHide, multiSelectable && !tag ), activeValue: syncState == null ? void 0 : syncState.activeValue }); const combobox = createStore(initialState, composite, popover, store); if (isTouchSafari) { setup( combobox, () => sync(combobox, ["virtualFocus"], () => { combobox.setState("virtualFocus", false); }) ); } setup(combobox, () => { if (!tag) return; return chain( sync(combobox, ["selectedValue"], (state) => { if (!Array.isArray(state.selectedValue)) return; tag.setValues(state.selectedValue); }), sync(tag, ["values"], (state) => { combobox.setState("selectedValue", state.values); }) ); }); setup( combobox, () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => { if (!state.resetValueOnHide) return; if (state.mounted) return; combobox.setState("value", value); }) ); setup( combobox, () => sync(combobox, ["open"], (state) => { if (state.open) return; combobox.setState("activeId", activeId); combobox.setState("moves", 0); }) ); setup( combobox, () => sync(combobox, ["moves", "activeId"], (state, prevState) => { if (state.moves === prevState.moves) { combobox.setState("activeValue", void 0); } }) ); setup( combobox, () => batch(combobox, ["moves", "renderedItems"], (state, prev) => { if (state.moves === prev.moves) return; const { activeId: activeId2 } = combobox.getState(); const activeItem = composite.item(activeId2); combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value); }) ); return __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, popover), composite), combobox), { tag, setValue: (value2) => combobox.setState("value", value2), resetValue: () => combobox.setState("value", initialState.value), setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2) }); } export { createComboboxStore };