UNPKG

@ariakit/react-core

Version:

Ariakit React core

124 lines (108 loc) 3.99 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _2MWKJ5UMcjs = require('../__chunks/2MWKJ5UM.cjs'); require('../__chunks/QXXNZT2I.cjs'); require('../__chunks/5WCU5NVK.cjs'); require('../__chunks/57Z4CQLB.cjs'); require('../__chunks/GCJBB4ZT.cjs'); var _EMYYI4CZcjs = require('../__chunks/EMYYI4CZ.cjs'); require('../__chunks/QJGTENWI.cjs'); var _WBFXWJUHcjs = require('../__chunks/WBFXWJUH.cjs'); require('../__chunks/MZ2HG624.cjs'); require('../__chunks/XMDZRF6Y.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 = _WBFXWJUHcjs.createHook.call(void 0, function useComboboxItemValue2({ store, value, userValue, ...props }) { const context = _2MWKJ5UMcjs.useComboboxScopedContext.call(void 0, ); store = store || context; const itemContext = _react.useContext.call(void 0, _2MWKJ5UMcjs.ComboboxItemValueContext); const itemValue = value != null ? value : itemContext; const inputValue = _EMYYI4CZcjs.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 = { children, ...props }; return _misc.removeUndefinedValues.call(void 0, props); }); var ComboboxItemValue = _WBFXWJUHcjs.forwardRef.call(void 0, function ComboboxItemValue2(props) { const htmlProps = useComboboxItemValue(props); return _WBFXWJUHcjs.createElement.call(void 0, TagName, htmlProps); }); exports.ComboboxItemValue = ComboboxItemValue; exports.useComboboxItemValue = useComboboxItemValue;