UNPKG

@ariakit/react-core

Version:

Ariakit React core

128 lines (109 loc) 4.18 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _PH2DFCJScjs = require('../__chunks/PH2DFCJS.cjs'); require('../__chunks/ZVJRPAXY.cjs'); require('../__chunks/YDPERDKF.cjs'); require('../__chunks/KVXNVDJK.cjs'); require('../__chunks/D6FV6EYS.cjs'); var _25BPIGZHcjs = require('../__chunks/25BPIGZH.cjs'); require('../__chunks/6HKL3JR2.cjs'); var _WULEED4Qcjs = require('../__chunks/WULEED4Q.cjs'); require('../__chunks/OZM4QA2V.cjs'); require('../__chunks/FDRJDQ5Y.cjs'); var _7EQBAZ46cjs = require('../__chunks/7EQBAZ46.cjs'); // src/combobox/combobox-item-value.tsx var _array = require('@ariakit/core/utils/array'); var _misc = require('@ariakit/core/utils/misc'); var _react = require('react'); var _jsxruntime = require('react/jsx-runtime'); var TagName = "span"; function normalizeValue(value) { return _misc.normalizeString.call(void 0, value).toLowerCase(); } function getOffsets(string, values) { const offsets = []; for (const value of values) { let pos = 0; const length = value.length; while (string.indexOf(value, pos) !== -1) { const index = string.indexOf(value, pos); if (index !== -1) { offsets.push([index, length]); } pos = index + 1; } } return offsets; } function filterOverlappingOffsets(offsets) { return offsets.filter(([offset, length], i, arr) => { return !arr.some( ([o, l], j) => j !== i && o <= offset && o + l >= offset + length ); }); } function sortOffsets(offsets) { return offsets.sort(([a], [b]) => a - b); } function splitValue(itemValue, userValue) { if (!itemValue) return itemValue; if (!userValue) return itemValue; const userValues = _array.toArray.call(void 0, userValue).filter(Boolean).map(normalizeValue); const parts = []; const span = (value, autocomplete = false) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { "data-autocomplete-value": autocomplete ? "" : void 0, "data-user-value": autocomplete ? void 0 : "", children: value }, parts.length ); const offsets = sortOffsets( filterOverlappingOffsets( // Convert userValues into a set to avoid duplicates getOffsets(normalizeValue(itemValue), new Set(userValues)) ) ); if (!offsets.length) { parts.push(span(itemValue, true)); return parts; } const [firstOffset] = offsets[0]; const values = [ itemValue.slice(0, firstOffset), ...offsets.flatMap(([offset, length], i) => { var _a; const value = itemValue.slice(offset, offset + length); const nextOffset = (_a = offsets[i + 1]) == null ? void 0 : _a[0]; const nextValue = itemValue.slice(offset + length, nextOffset); return [value, nextValue]; }) ]; values.forEach((value, i) => { if (!value) return; parts.push(span(value, i % 2 === 0)); }); return parts; } var useComboboxItemValue = _WULEED4Qcjs.createHook.call(void 0, function useComboboxItemValue2(_a) { var _b = _a, { store, value, userValue } = _b, props = _7EQBAZ46cjs.__objRest.call(void 0, _b, ["store", "value", "userValue"]); const context = _PH2DFCJScjs.useComboboxScopedContext.call(void 0, ); store = store || context; const itemContext = _react.useContext.call(void 0, _PH2DFCJScjs.ComboboxItemValueContext); const itemValue = value != null ? value : itemContext; const inputValue = _25BPIGZHcjs.useStoreState.call(void 0, store, (state) => userValue != null ? userValue : state == null ? void 0 : state.value); const children = _react.useMemo.call(void 0, () => { if (!itemValue) return; if (!inputValue) return itemValue; return splitValue(itemValue, inputValue); }, [itemValue, inputValue]); props = _7EQBAZ46cjs.__spreadValues.call(void 0, { children }, props); return _misc.removeUndefinedValues.call(void 0, props); }); var ComboboxItemValue = _WULEED4Qcjs.forwardRef.call(void 0, function ComboboxItemValue2(props) { const htmlProps = useComboboxItemValue(props); return _WULEED4Qcjs.createElement.call(void 0, TagName, htmlProps); }); exports.ComboboxItemValue = ComboboxItemValue; exports.useComboboxItemValue = useComboboxItemValue;