+
+
+ {results !== null ? (
+ results.length === 0 ? (
+
+ No operations match “{debouncedQuery.trim()}”. Search covers
+ operation names, tags, and HTTP methods.
+
+ ) : (
+
+ {results.map((op) => (
+
+ ))}
+
+ )
+ ) : (
+ <>
+ {items.map((item, index) => {
+ if (isDoc(item)) {
+ if (SKIP_IDS.has(item.id)) return null
+ return (
+
+ )
+ }
+
+ if (isCategory(item)) {
+ return (
+
+ {item.label}
+
+ {item.items.map((child, childIndex) =>
+ isDoc(child) ? (
+
+ ) : null,
+ )}
+
+
+ )
+ }
+
+ return null
+ })}
+ >
+ )}
+
+ )
+}
diff --git a/src/components/OpenApiReferenceIndex/markdown.tsx b/src/components/OpenApiReferenceIndex/markdown.tsx
new file mode 100644
index 0000000000..24b729f05a
--- /dev/null
+++ b/src/components/OpenApiReferenceIndex/markdown.tsx
@@ -0,0 +1,46 @@
+// Small text helpers for rendering operation descriptions.
+
+import React from "react"
+
+const MD_LINK = /\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g
+
+export function renderInlineMarkdown(text: string): React.ReactNode {
+ const parts: React.ReactNode[] = []
+ let last = 0
+ let match: RegExpExecArray | null
+ MD_LINK.lastIndex = 0
+ while ((match = MD_LINK.exec(text)) !== null) {
+ if (match.index > last) parts.push(text.slice(last, match.index))
+ parts.push(
+