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