@kobalte/core
Version:
Unstyled components and primitives for building accessible web apps and design systems with SolidJS.
227 lines (218 loc) • 6.2 kB
JSX
import {
ComboboxBase,
ComboboxContent,
ComboboxControl,
ComboboxHiddenSelect,
ComboboxIcon,
ComboboxInput,
ComboboxListbox,
ComboboxPortal
} from "../chunk/E4PLEADY.jsx";
import "../chunk/3LKATPLK.jsx";
import {
ListboxItem,
ListboxItemDescription,
ListboxItemLabel,
ListboxSection
} from "../chunk/2I3Q5YLM.jsx";
import "../chunk/FINWO3A5.jsx";
import {
PopperArrow
} from "../chunk/2CTBMVJ4.jsx";
import "../chunk/N3GAC5SS.jsx";
import "../chunk/QZDH5R5B.jsx";
import "../chunk/YRH543JR.jsx";
import "../chunk/LR7LBJN3.jsx";
import "../chunk/7A3GDF4Y.jsx";
import "../chunk/FBCYWU27.jsx";
import "../chunk/3VFJM5NZ.jsx";
import "../chunk/MGQGUY64.jsx";
import "../chunk/IGYOA2ZZ.jsx";
import "../chunk/3NI6FTA2.jsx";
import "../chunk/JHMNWOLY.jsx";
import "../chunk/E53DB7BS.jsx";
import "../chunk/NGHEENNE.jsx";
import {
FormControlLabel
} from "../chunk/FOXVCQFV.jsx";
import "../chunk/QJIB6BDF.jsx";
import {
FormControlDescription
} from "../chunk/XUUROM4M.jsx";
import "../chunk/EJ5I5XML.jsx";
import "../chunk/JNCCF6MP.jsx";
import "../chunk/FN6EICGO.jsx";
import "../chunk/OYES4GOP.jsx";
import {
Polymorphic
} from "../chunk/FLVHQV4A.jsx";
import "../chunk/5WXHJDCZ.jsx";
// src/search/search-indicator.tsx
import { Show, splitProps } from "solid-js";
// src/search/search-context.tsx
import { createContext, useContext } from "solid-js";
var SearchContext = createContext();
function useSearchContext() {
const context = useContext(SearchContext);
if (context === void 0) {
throw new Error(
"[kobalte]: `useSearchContext` must be used within a `Search` component"
);
}
return context;
}
// src/search/search-indicator.tsx
function SearchIndicator(props) {
const [local, other] = splitProps(props, ["loadingComponent"]);
const context = useSearchContext();
return <Polymorphic as="span" aria-hidden="true" {...other}><Show
when={context.isLoadingSuggestions() === false || !local.loadingComponent}
fallback={local.loadingComponent}
>{props.children}</Show></Polymorphic>;
}
// src/search/search-no-result.tsx
import { Show as Show2 } from "solid-js";
function SearchNoResult(props) {
const context = useSearchContext();
return <Show2 when={context.noResult()}><Polymorphic as="div" {...props} /></Show2>;
}
// src/search/search-root.tsx
import {
createEffect,
createMemo,
createSignal,
splitProps as splitProps2
} from "solid-js";
// src/search/utils.ts
var DebouncerTimeout = () => {
let _debounceMillisecond = 0;
let lastCallbackTime = 0;
let timeout;
return {
debounce: (callback) => {
if (lastCallbackTime > Date.now() - _debounceMillisecond)
clearTimeout(timeout);
timeout = setTimeout(callback, _debounceMillisecond);
lastCallbackTime = Date.now();
return timeout;
},
setDebounceMillisecond: (debounceMillisecond = 0) => {
_debounceMillisecond = debounceMillisecond;
}
};
};
// src/search/search-root.tsx
function SearchRoot(props) {
const [local, omit, others] = splitProps2(
props,
[
"options",
"value",
"defaultValue",
"onChange",
"multiple",
"onInputChange",
"debounceOptionsMillisecond"
],
// @ts-expect-error filter is handled externally, so it's omitted
["defaultFilter"]
);
const [isLoadingSuggestions, setIsLoadingSuggestions] = createSignal(false);
const [suggestionTimeout, setSuggestionTimeout] = createSignal();
const inputChangeDebouncer = DebouncerTimeout();
createEffect(
() => inputChangeDebouncer.setDebounceMillisecond(
local.debounceOptionsMillisecond
)
);
const onInputChange = (value2) => {
if (local.onInputChange === void 0)
return;
setIsLoadingSuggestions(true);
const timeout = inputChangeDebouncer.debounce(async () => {
await local.onInputChange(value2);
setIsLoadingSuggestions(false);
});
setSuggestionTimeout(timeout);
};
const value = createMemo(() => {
if (local.value != null) {
return local.multiple ? local.value : [local.value];
}
return local.value;
});
const defaultValue = createMemo(() => {
if (local.defaultValue != null) {
return local.multiple ? local.defaultValue : [local.defaultValue];
}
return local.defaultValue;
});
const onChange = (value2) => {
clearTimeout(suggestionTimeout());
setIsLoadingSuggestions(false);
if (local.multiple) {
local.onChange?.(value2 ?? []);
} else {
local.onChange?.(value2[0] ?? null);
}
};
const noResult = () => local.options.length === 0;
const context = {
noResult,
isLoadingSuggestions
};
return <SearchContext.Provider value={context}><ComboboxBase
closeOnSelection
shouldFocusWrap
noResetInputOnBlur
allowsEmptyCollection={true}
options={local.options}
value={value()}
defaultValue={defaultValue()}
onInputChange={onInputChange}
defaultFilter={() => true}
onChange={onChange}
selectionMode={local.multiple ? "multiple" : "single"}
{...others}
/></SearchContext.Provider>;
}
// src/search/index.tsx
var Search = Object.assign(SearchRoot, {
Arrow: PopperArrow,
Content: ComboboxContent,
Control: ComboboxControl,
Description: FormControlDescription,
HiddenSelect: ComboboxHiddenSelect,
Icon: ComboboxIcon,
Input: ComboboxInput,
Item: ListboxItem,
ItemDescription: ListboxItemDescription,
ItemLabel: ListboxItemLabel,
Label: FormControlLabel,
Listbox: ComboboxListbox,
Portal: ComboboxPortal,
Section: ListboxSection,
NoResult: SearchNoResult,
Indicator: SearchIndicator
});
export {
PopperArrow as Arrow,
ComboboxContent as Content,
ComboboxControl as Control,
FormControlDescription as Description,
ComboboxHiddenSelect as HiddenSelect,
ComboboxIcon as Icon,
SearchIndicator as Indicator,
ComboboxInput as Input,
ListboxItem as Item,
ListboxItemDescription as ItemDescription,
ListboxItemLabel as ItemLabel,
FormControlLabel as Label,
ComboboxListbox as Listbox,
SearchNoResult as NoResult,
ComboboxPortal as Portal,
SearchRoot as Root,
Search,
ListboxSection as Section,
useSearchContext
};