@ariakit/react-core
Version:
Ariakit React core
128 lines (109 loc) • 4.18 kB
JavaScript
;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;