+ {/* Scrolling moves the flyout's row away without a pointer event, which would leave it detached. */}
+ {
+ scroller = element
+ createEventListener(
+ element,
+ "scroll",
+ () => {
+ follow()
+ fadeHeaders()
+ },
+ { capture: true },
+ )
+ // A wheel scroll is the pointer's, so the highlight and flyout follow the row under it.
+ createEventListener(element, "wheel", () => setStore("keyboard", false), { passive: true })
+ }}
+ >
+ (list = handle)}
+ query={store.search}
+ onQuery={setSearch}
+ placeholder={language.t("dialog.model.search.placeholder")}
+ trailing={
+
+ }
+ aria-label={language.t("dialog.model.manage")}
+ onClick={manage}
+ />
+
+ }
+ items={rows()}
+ key={(row) => row.id}
+ section={(row) => row.group.category}
+ header={(row) => (
+
+ {row.group.title ?? labels.name(row.item.provider)}
+
+ {(workspace) => {workspace()}}
+
+
+ )}
+ empty={language.t("dialog.model.empty")}
+ onSelect={(row) => choose(row.item)}
+ onKeyDown={onKeyDown}
+ >
+ {(row, attrs) =>
}
+
+
+
+
+
+
+