@ariakit/react-core
Version:
Ariakit React core
125 lines (109 loc) • 4.02 kB
JavaScript
;Object.defineProperty(exports, "__esModule", {value: true});
var _IOFHSY3Lcjs = require('../__chunks/IOFHSY3L.cjs');
require('../__chunks/7X7JMIHX.cjs');
require('../__chunks/WDV6EJ2U.cjs');
require('../__chunks/VFNUZFXS.cjs');
require('../__chunks/EOGOO37X.cjs');
var _RDNUVX4Vcjs = require('../__chunks/RDNUVX4V.cjs');
require('../__chunks/ZYZTL3IQ.cjs');
var _SQLDFLTEcjs = require('../__chunks/SQLDFLTE.cjs');
require('../__chunks/4KGS3DOW.cjs');
require('../__chunks/TWX5YNTH.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))
)
);
const firstEntry = offsets[0];
if (!firstEntry) {
parts.push(span(itemValue, true));
return parts;
}
const [firstOffset] = firstEntry;
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 = _SQLDFLTEcjs.createHook.call(void 0, function useComboboxItemValue2({ store, value, userValue, ...props }) {
const context = _IOFHSY3Lcjs.useComboboxScopedContext.call(void 0, );
store = store || context;
const itemContext = _react.useContext.call(void 0, _IOFHSY3Lcjs.ComboboxItemValueContext);
const itemValue = value != null ? value : itemContext;
const inputValue = _RDNUVX4Vcjs.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 = _SQLDFLTEcjs.forwardRef.call(void 0, function ComboboxItemValue2(props) {
const htmlProps = useComboboxItemValue(props);
return _SQLDFLTEcjs.createElement.call(void 0, TagName, htmlProps);
});
exports.ComboboxItemValue = ComboboxItemValue; exports.useComboboxItemValue = useComboboxItemValue;