{
+ input.current?.focus();
+ }}
+ >
+ {local.value.map((e, idx) => {
+ return (
+
{
+ ev.stopPropagation();
+ ev.preventDefault();
+ local.value = local.value.filter((val) => e !== val);
+ local.render();
+ input.current?.focus();
+ }}
+ >
+ {e}
+
+
+ );
+ })}
+
+
{
+ if (!open) {
+ local.select = null;
+ }
+ local.open = open;
+ local.render();
+ }}
+ open={local.open}
+ options={options}
+ searching={local.search.searching}
+ onSelect={(value) => {
+ local.open = false;
+ local.value.push(value);
+ resetSearch();
+ local.render();
+ }}
+ selected={local.select?.value}
+ >
+ {
+ e.stopPropagation();
+ }}
+ onFocus={(e) => {
+ if (!local.open) {
+ if (local.on_focus_open) {
+ openOptions();
+ local.open = true;
+ local.render();
+ }
+ }
+ }}
+ onChange={async (e) => {
+ const val = e.currentTarget.value;
+ if (!local.open) {
+ local.open = true;
+ }
+ local.search.input = val;
+ local.render();
+
+ if (local.search.promise) {
+ await local.search.promise;
+ }
+
+ local.search.searching = true;
+ local.render();
+
+ if (local.search.searching) {
+ if (local.local_search) {
+ if (!local.loaded) {
+ await openOptions();
+ }
+ const search = local.search.input.toLowerCase();
+ if (search) {
+ local.search.result = local.options.filter((e) =>
+ e.label.toLowerCase().includes(search)
+ );
+ } else {
+ local.search.result = null;
+ }
+ local.search.searching = false;
+ local.render();
+ } else {
+ clearTimeout(local.search.timeout);
+ local.search.timeout = setTimeout(async () => {
+ const result = options_fn?.({
+ search: local.search.input,
+ existing: local.options,
+ });
+ if (result) {
+ if (result instanceof Promise) {
+ local.search.promise = result;
+ local.search.result = (await result).map((item) => {
+ if (typeof item === "string")
+ return { value: item, label: item };
+ return item;
+ });
+ local.search.searching = false;
+ local.search.promise = null;
+ local.render();
+ } else {
+ local.search.result = result.map((item) => {
+ if (typeof item === "string")
+ return { value: item, label: item };
+ return item;
+ });
+ local.search.searching = false;
+ local.render();
+ }
+ }
+ }, 100);
+ }
+ }
+ }}
+ spellCheck={false}
+ className={cx("c-flex-1 c-mb-2 c-text-sm c-outline-none")}
+ onKeyDown={keydown}
+ />
+
+
+ );
+};
+
+const WrapOptions: FC<{
+ wrap: boolean;
+ children: any;
+ open: boolean;
+ onOpenChange: (open: boolean) => void;
+ options: { value: string; label: string }[];
+ selected?: string;
+ onSelect: (value: string) => void;
+ searching?: boolean;
+}> = ({
+ wrap,
+ children,
+ open,
+ onOpenChange,
+ options,
+ selected,
+ onSelect,
+ searching,
+}) => {
+ if (!wrap) return children;
+
+ return (
+