@clarify-labs/renderer 0.9.4 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/output/{ClarifyShell-D2P0iZ_m.js → ClarifyShell-1LuBliwt.js} +124 -40
  2. package/output/ClarifyShell-1LuBliwt.js.map +1 -0
  3. package/output/{ClarifyShell-7r92MZg9.cjs → ClarifyShell-C6li72Ce.cjs} +138 -54
  4. package/output/ClarifyShell-C6li72Ce.cjs.map +1 -0
  5. package/output/MermaidViewer-B6-BMCJG.cjs +101 -0
  6. package/output/MermaidViewer-B6-BMCJG.cjs.map +1 -0
  7. package/output/MermaidViewer-dXsomvM7.js +98 -0
  8. package/output/MermaidViewer-dXsomvM7.js.map +1 -0
  9. package/output/{OpenApiOperation-Dhlz3JSx.js → OpenApiOperation-CqNM-no4.js} +274 -206
  10. package/output/OpenApiOperation-CqNM-no4.js.map +1 -0
  11. package/output/{OpenApiOperation-CyyPlZL6.cjs → OpenApiOperation-DK46w2dq.cjs} +305 -225
  12. package/output/OpenApiOperation-DK46w2dq.cjs.map +1 -0
  13. package/output/{PageActions-CTn2XkPg.cjs → PageActions-BjB6PYmL.cjs} +76 -735
  14. package/output/PageActions-BjB6PYmL.cjs.map +1 -0
  15. package/output/{PageActions-D0PA8Zv5.js → PageActions-D7K9LDGf.js} +67 -678
  16. package/output/PageActions-D7K9LDGf.js.map +1 -0
  17. package/output/SearchDialog-CIPvXMT3.cjs +414 -0
  18. package/output/SearchDialog-CIPvXMT3.cjs.map +1 -0
  19. package/output/SearchDialog-CxYLjRi5.js +411 -0
  20. package/output/SearchDialog-CxYLjRi5.js.map +1 -0
  21. package/output/app/AppShell.d.ts +2 -2
  22. package/output/app/SectionHashSync.d.ts +6 -0
  23. package/output/client.cjs +3 -3
  24. package/output/client.js +3 -3
  25. package/output/components/MermaidViewer.d.ts +7 -0
  26. package/output/context.d.ts +1 -1
  27. package/output/core/context.d.ts +3 -4
  28. package/output/core/i18n.d.ts +1 -1
  29. package/output/core/index.d.ts +1 -1
  30. package/output/core/types.d.ts +36 -19
  31. package/output/i18n-DnqZHFT7.js +247 -0
  32. package/output/i18n-DnqZHFT7.js.map +1 -0
  33. package/output/i18n-b4iTLeia.cjs +294 -0
  34. package/output/i18n-b4iTLeia.cjs.map +1 -0
  35. package/output/index.cjs +91 -94
  36. package/output/index.cjs.map +1 -1
  37. package/output/index.d.ts +5 -5
  38. package/output/index.js +83 -86
  39. package/output/index.js.map +1 -1
  40. package/output/markdown.cjs +1 -1
  41. package/output/openapi/components/EndpointSections.d.ts +3 -1
  42. package/output/openapi/components/ExamplePanels.d.ts +3 -1
  43. package/output/openapi/components/OpenApiOperation.d.ts +3 -1
  44. package/output/openapi/components/OpenApiOperation.state.d.ts +3 -3
  45. package/output/openapi/components/SchemaProperties.d.ts +1 -0
  46. package/output/openapi/components/helpers.d.ts +2 -2
  47. package/output/openapi/entry.d.ts +0 -1
  48. package/output/openapi/lib/helpers.d.ts +5 -3
  49. package/output/openapi/lib/request-code.d.ts +2 -1
  50. package/output/openapi/lib/spec-path.d.ts +6 -1
  51. package/output/openapi/lib/utils.d.ts +10 -4
  52. package/output/preview.cjs +7 -5
  53. package/output/preview.cjs.map +1 -1
  54. package/output/preview.js +5 -3
  55. package/output/preview.js.map +1 -1
  56. package/output/remark-Dd2WU50s.js.map +1 -1
  57. package/output/{remark-Dv3owbSH.cjs → remark-zSQT0MBv.cjs} +3 -3
  58. package/output/{remark-Dv3owbSH.cjs.map → remark-zSQT0MBv.cjs.map} +1 -1
  59. package/output/{render-CwSsfrs7.js → render-DKj24Jqw.js} +15 -8
  60. package/output/render-DKj24Jqw.js.map +1 -0
  61. package/output/{render-DXDSIfZ8.cjs → render-Di5B6Zc0.cjs} +15 -8
  62. package/output/render-Di5B6Zc0.cjs.map +1 -0
  63. package/output/renderer.css +55 -1
  64. package/output/runtime/ClarifyShell.d.ts +5 -6
  65. package/output/server.cjs +4 -4
  66. package/output/server.cjs.map +1 -1
  67. package/output/server.js +4 -4
  68. package/output/server.js.map +1 -1
  69. package/output/shell/Navigation.d.ts +1 -0
  70. package/output/shell/search/SearchDialog.d.ts +1 -1
  71. package/output/slots/RuntimeSlot.d.ts +7 -7
  72. package/output/slots/context.d.ts +5 -5
  73. package/output/slots/index.d.ts +2 -2
  74. package/output/slots/types.d.ts +1 -1
  75. package/output/utils/path.d.ts +1 -1
  76. package/package.json +10 -10
  77. package/output/ClarifyShell-7r92MZg9.cjs.map +0 -1
  78. package/output/ClarifyShell-D2P0iZ_m.js.map +0 -1
  79. package/output/OpenApiOperation-CyyPlZL6.cjs.map +0 -1
  80. package/output/OpenApiOperation-Dhlz3JSx.js.map +0 -1
  81. package/output/PageActions-CTn2XkPg.cjs.map +0 -1
  82. package/output/PageActions-D0PA8Zv5.js.map +0 -1
  83. package/output/render-CwSsfrs7.js.map +0 -1
  84. package/output/render-DXDSIfZ8.cjs.map +0 -1
  85. /package/output/{chunk-DakpK96I.cjs → rolldown-runtime-DakpK96I.cjs} +0 -0
@@ -0,0 +1,411 @@
1
+ import { t as useBuiltInText } from "./i18n-DnqZHFT7.js";
2
+ import { T as prefixHref } from "./PageActions-D7K9LDGf.js";
3
+ import clsx from "clsx";
4
+ import { Fragment, forwardRef, useEffect, useId, useMemo, useRef, useState } from "react";
5
+ import { useLocation, useNavigate } from "react-router-dom";
6
+ import { Dialog, DialogBackdrop, DialogPanel } from "@headlessui/react";
7
+ import { LoaderCircle, Search, SearchX } from "lucide-react";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
+ //#region source/shell/search/items.ts
10
+ function routeGroupTitles(navigation) {
11
+ const titles = /* @__PURE__ */ new Map();
12
+ for (const node of navigation) if (node.children?.length) for (const child of node.children) titles.set(child.path, node.title);
13
+ else titles.set(node.path, node.title);
14
+ return titles;
15
+ }
16
+ function buildSearchItems(routes, navigation) {
17
+ const groupTitles = routeGroupTitles(navigation);
18
+ return routes.flatMap((route) => {
19
+ if (route.isBareAlias) return [];
20
+ const groupTitle = groupTitles.get(route.path);
21
+ return [{
22
+ title: route.title,
23
+ pageTitle: route.title,
24
+ sectionTitle: groupTitle,
25
+ url: route.path,
26
+ keywords: [
27
+ groupTitle,
28
+ route.title,
29
+ route.path,
30
+ route.kind
31
+ ].filter(Boolean).join(" ").toLowerCase()
32
+ }, ...route.sections?.map((section) => ({
33
+ title: section.title,
34
+ pageTitle: route.title,
35
+ sectionTitle: groupTitle,
36
+ url: `${route.path}#${section.id}`,
37
+ keywords: [
38
+ groupTitle,
39
+ route.title,
40
+ section.title,
41
+ route.path,
42
+ section.id
43
+ ].filter(Boolean).join(" ").toLowerCase()
44
+ })) ?? []];
45
+ });
46
+ }
47
+ //#endregion
48
+ //#region source/shell/search/pagefind.ts
49
+ var pagefindPromises = /* @__PURE__ */ new Map();
50
+ function pagefindCacheKey(routePrefix, locale) {
51
+ return `${routePrefix || "/"}:${locale || "default"}`;
52
+ }
53
+ function loadPagefind(routePrefix, locale) {
54
+ if (typeof window === "undefined") return Promise.resolve(null);
55
+ const language = locale ?? document.documentElement.lang;
56
+ const cacheKey = pagefindCacheKey(routePrefix, language);
57
+ const cachedPagefind = pagefindPromises.get(cacheKey);
58
+ if (cachedPagefind) return cachedPagefind;
59
+ const pagefindPromise = import(
60
+ /* @vite-ignore */
61
+ prefixHref("/pagefind/pagefind.js", routePrefix)
62
+ ).then(async (module) => {
63
+ const previousLanguage = document.documentElement.lang;
64
+ if (language) document.documentElement.lang = language;
65
+ const pagefind = module.createInstance();
66
+ if (previousLanguage && previousLanguage !== language) document.documentElement.lang = previousLanguage;
67
+ await pagefind.init?.();
68
+ return pagefind;
69
+ }).catch((error) => {
70
+ pagefindPromises.delete(cacheKey);
71
+ console.warn("[clarify:search] Pagefind instance failed", {
72
+ cacheKey,
73
+ language,
74
+ error
75
+ });
76
+ return null;
77
+ });
78
+ pagefindPromises.set(cacheKey, pagefindPromise);
79
+ return pagefindPromise;
80
+ }
81
+ function normalizePagefindUrl(url, routePrefix) {
82
+ const parsedUrl = new URL(url, typeof window === "undefined" ? "http://localhost" : window.location.origin);
83
+ let pathname = parsedUrl.pathname;
84
+ const prefix = routePrefix && routePrefix !== "/" ? `/${routePrefix.replace(/^\/+|\/+$/g, "")}` : "";
85
+ if (prefix && (pathname === prefix || pathname.startsWith(`${prefix}/`))) pathname = pathname.slice(prefix.length) || "/";
86
+ return `${pathname}${parsedUrl.search}${parsedUrl.hash}`;
87
+ }
88
+ //#endregion
89
+ //#region source/shell/search/SearchInput.tsx
90
+ var SearchInput = forwardRef(function SearchInput(arg0, inputRef) {
91
+ const { query, setQuery, onClose, onSubmit, activeDescendantId, loading = false } = arg0;
92
+ const t = useBuiltInText();
93
+ return /* @__PURE__ */ jsxs("div", {
94
+ className: "clarify-search-input group relative flex h-12",
95
+ children: [/* @__PURE__ */ jsx(loading ? LoaderCircle : Search, {
96
+ "aria-hidden": "true",
97
+ className: clsx("pointer-events-none absolute top-0 left-3 h-full w-5 stroke-(--clarify-theme-tokens-colors-muted)", loading && "animate-spin")
98
+ }), /* @__PURE__ */ jsx("input", {
99
+ ref: inputRef,
100
+ "data-autofocus": true,
101
+ role: "combobox",
102
+ "aria-expanded": query !== "",
103
+ "aria-controls": "clarify-search-results",
104
+ "aria-activedescendant": activeDescendantId,
105
+ value: query,
106
+ onChange: (event) => setQuery(event.currentTarget.value),
107
+ onKeyDown: (event) => {
108
+ if (event.key === "Escape") if (query) setQuery("");
109
+ else onClose();
110
+ if (event.key === "Enter") {
111
+ event.preventDefault();
112
+ onSubmit();
113
+ }
114
+ },
115
+ placeholder: t("search.placeholder"),
116
+ className: "clarify-search-field flex-auto appearance-none bg-transparent pr-4 pl-10 outline-hidden focus:w-full focus:flex-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden"
117
+ })]
118
+ });
119
+ });
120
+ //#endregion
121
+ //#region source/shell/search/Highlight.tsx
122
+ function stripHtml(value) {
123
+ if (typeof document === "undefined") return value.replace(/<[^>]*>/g, "");
124
+ const template = document.createElement("template");
125
+ template.innerHTML = value;
126
+ return template.content.textContent ?? "";
127
+ }
128
+ function escapeRegExp(value) {
129
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130
+ }
131
+ function HighlightQuery(arg0) {
132
+ const { text, query } = arg0;
133
+ if (!query) return text;
134
+ return /* @__PURE__ */ jsx(Fragment$1, { children: text.split(new RegExp(`(${escapeRegExp(query)})`, "ig")).map((part, index) => part.toLowerCase() === query.toLowerCase() ? /* @__PURE__ */ jsx("mark", {
135
+ className: "bg-transparent text-(--clarify-theme-tokens-colors-primary) underline",
136
+ children: part
137
+ }, index) : /* @__PURE__ */ jsx(Fragment, { children: part }, index)) });
138
+ }
139
+ function renderExcerptNode(node, key) {
140
+ if (node.nodeType === Node.TEXT_NODE) return node.textContent;
141
+ if (node.nodeType !== Node.ELEMENT_NODE) return null;
142
+ const element = node;
143
+ const children = Array.from(element.childNodes).map((child, index) => renderExcerptNode(child, `${key}-${index}`));
144
+ if (element.tagName.toLowerCase() === "mark") return /* @__PURE__ */ jsx("mark", {
145
+ className: "bg-transparent text-(--clarify-theme-tokens-colors-primary) underline",
146
+ children
147
+ }, key);
148
+ return /* @__PURE__ */ jsx(Fragment, { children }, key);
149
+ }
150
+ function HighlightExcerpt(arg0) {
151
+ const { excerpt, query } = arg0;
152
+ if (typeof document === "undefined" || !excerpt.includes("<mark")) return /* @__PURE__ */ jsx(HighlightQuery, {
153
+ text: stripHtml(excerpt),
154
+ query
155
+ });
156
+ const template = document.createElement("template");
157
+ template.innerHTML = excerpt;
158
+ return /* @__PURE__ */ jsx(Fragment$1, { children: Array.from(template.content.childNodes).map((node, index) => renderExcerptNode(node, String(index))) });
159
+ }
160
+ //#endregion
161
+ //#region source/shell/search/SearchResult.tsx
162
+ function SearchResult(arg0) {
163
+ const { result, query, active, onActive, onSelect } = arg0;
164
+ const id = useId();
165
+ const hierarchy = result.type === "quick" ? [result.sectionTitle, result.pageTitle].filter((value) => typeof value === "string") : [];
166
+ return /* @__PURE__ */ jsxs("li", {
167
+ id,
168
+ className: clsx("clarify-search-result group block cursor-pointer px-4 py-3", active && "clarify-search-result-active"),
169
+ "aria-selected": active,
170
+ onMouseEnter: onActive,
171
+ onMouseMove: onActive,
172
+ onMouseDown: (event) => {
173
+ event.preventDefault();
174
+ onSelect();
175
+ },
176
+ children: [
177
+ /* @__PURE__ */ jsx("div", {
178
+ className: "clarify-search-result-title",
179
+ children: /* @__PURE__ */ jsx(HighlightQuery, {
180
+ text: result.title,
181
+ query
182
+ })
183
+ }),
184
+ hierarchy.length > 0 ? /* @__PURE__ */ jsx("div", {
185
+ className: "clarify-search-result-hierarchy mt-1 truncate whitespace-nowrap",
186
+ children: hierarchy.map((item, itemIndex, items) => /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(HighlightQuery, {
187
+ text: item,
188
+ query
189
+ }), /* @__PURE__ */ jsx("span", {
190
+ className: itemIndex === items.length - 1 ? "sr-only" : "clarify-search-result-separator mx-2",
191
+ children: "/"
192
+ })] }, `${item}-${itemIndex}`))
193
+ }) : null,
194
+ result.type === "full-text" && result.excerpt ? /* @__PURE__ */ jsx("p", {
195
+ className: "clarify-search-result-excerpt mt-1 line-clamp-2 text-xs leading-5 text-(--clarify-theme-tokens-colors-muted)",
196
+ children: /* @__PURE__ */ jsx(HighlightExcerpt, {
197
+ excerpt: result.excerpt,
198
+ query
199
+ })
200
+ }) : null
201
+ ]
202
+ });
203
+ }
204
+ //#endregion
205
+ //#region source/shell/search/SearchDialog.tsx
206
+ function useSearchDialogLifecycle(arg0) {
207
+ const { open, setOpen } = arg0;
208
+ const location = useLocation();
209
+ useEffect(() => {
210
+ setOpen(false);
211
+ }, [
212
+ location.pathname,
213
+ location.search,
214
+ location.hash,
215
+ setOpen
216
+ ]);
217
+ useEffect(() => {
218
+ if (typeof window === "undefined") return void 0;
219
+ if (open) return void 0;
220
+ function onKeyDown(event) {
221
+ if (event.key === "k" && (event.metaKey || event.ctrlKey)) {
222
+ event.preventDefault();
223
+ setOpen(true);
224
+ }
225
+ }
226
+ window.addEventListener("keydown", onKeyDown);
227
+ return () => window.removeEventListener("keydown", onKeyDown);
228
+ }, [open, setOpen]);
229
+ }
230
+ function useSearchData(arg0) {
231
+ const { query, searchItems, routePrefix, currentLocale } = arg0;
232
+ const [fullTextState, setFullTextState] = useState(null);
233
+ const [pagefindState, setPagefindState] = useState(null);
234
+ const quickResults = useMemo(() => {
235
+ const normalizedQuery = query.trim().toLowerCase();
236
+ if (!normalizedQuery) return [];
237
+ return searchItems.filter((item) => item.keywords.includes(normalizedQuery)).slice(0, 8).map((item) => ({
238
+ ...item,
239
+ type: "quick"
240
+ }));
241
+ }, [query, searchItems]);
242
+ const pagefindKey = pagefindCacheKey(routePrefix, currentLocale);
243
+ const activePagefindState = pagefindState?.key === pagefindKey ? pagefindState : null;
244
+ const pagefind = activePagefindState?.pagefind ?? null;
245
+ const pagefindAvailable = activePagefindState?.available ?? null;
246
+ const trimmedQuery = query.trim();
247
+ const fullTextKey = `${pagefindKey}:${trimmedQuery}`;
248
+ const results = (fullTextState?.key === fullTextKey ? fullTextState.results : null) ?? quickResults;
249
+ const searchInputLoading = pagefindAvailable === null || Boolean(trimmedQuery && pagefind && fullTextState?.key !== fullTextKey);
250
+ const showNoResults = Boolean(query.trim()) && results.length === 0 && pagefindAvailable !== null;
251
+ useEffect(() => {
252
+ let cancelled = false;
253
+ loadPagefind(routePrefix, currentLocale).then((loadedPagefind) => {
254
+ if (cancelled) return;
255
+ setPagefindState({
256
+ key: pagefindKey,
257
+ pagefind: loadedPagefind,
258
+ available: Boolean(loadedPagefind)
259
+ });
260
+ });
261
+ return () => {
262
+ cancelled = true;
263
+ };
264
+ }, [
265
+ currentLocale,
266
+ pagefindKey,
267
+ routePrefix
268
+ ]);
269
+ useEffect(() => {
270
+ let cancelled = false;
271
+ if (!trimmedQuery || !pagefind) return void 0;
272
+ Promise.resolve().then(async () => {
273
+ if (cancelled) return;
274
+ try {
275
+ const search = await pagefind.search(trimmedQuery, { limit: 8 });
276
+ const data = await Promise.all(search.results.map(async (result) => ({
277
+ id: result.id,
278
+ data: await result.data()
279
+ })));
280
+ if (cancelled) return;
281
+ setFullTextState({
282
+ key: fullTextKey,
283
+ results: data.map(({ id, data }) => ({
284
+ type: "full-text",
285
+ id,
286
+ title: data.meta.title || data.url,
287
+ url: normalizePagefindUrl(data.url, routePrefix),
288
+ excerpt: data.excerpt
289
+ }))
290
+ });
291
+ } catch (error) {
292
+ console.warn("[clarify:search] Pagefind search failed", {
293
+ currentLocale,
294
+ query: trimmedQuery,
295
+ error
296
+ });
297
+ if (!cancelled) setFullTextState({
298
+ key: fullTextKey,
299
+ results: null
300
+ });
301
+ }
302
+ });
303
+ return () => {
304
+ cancelled = true;
305
+ };
306
+ }, [
307
+ currentLocale,
308
+ fullTextKey,
309
+ pagefind,
310
+ routePrefix,
311
+ trimmedQuery
312
+ ]);
313
+ return {
314
+ results,
315
+ searchInputLoading,
316
+ showNoResults
317
+ };
318
+ }
319
+ function SearchDialog(arg0) {
320
+ const { open, setOpen, routes, navigation, routePrefix = "/", currentLocale, className, onNavigate = () => {} } = arg0;
321
+ const t = useBuiltInText();
322
+ const navigate = useNavigate();
323
+ const inputRef = useRef(null);
324
+ const [query, setQuery] = useState("");
325
+ const [activeIndex, setActiveIndex] = useState(0);
326
+ const searchItems = useMemo(() => buildSearchItems(routes, navigation), [navigation, routes]);
327
+ useSearchDialogLifecycle({
328
+ open,
329
+ setOpen
330
+ });
331
+ const { results, searchInputLoading, showNoResults } = useSearchData({
332
+ query,
333
+ searchItems,
334
+ routePrefix,
335
+ currentLocale
336
+ });
337
+ const updateQuery = (value) => {
338
+ setQuery(value);
339
+ setActiveIndex(0);
340
+ };
341
+ function closeDialog() {
342
+ updateQuery("");
343
+ setOpen(false);
344
+ }
345
+ function selectResult(result = results[activeIndex]) {
346
+ if (!result) return;
347
+ navigate(result.url);
348
+ onNavigate();
349
+ closeDialog();
350
+ }
351
+ function renderResultsPanel() {
352
+ return /* @__PURE__ */ jsxs("div", {
353
+ className: "border-t border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-background) empty:hidden dark:border-zinc-100/5 dark:bg-white/2.5",
354
+ children: [showNoResults ? /* @__PURE__ */ jsxs("div", {
355
+ className: "p-6 text-center",
356
+ children: [/* @__PURE__ */ jsx(SearchX, { className: "mx-auto h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-zinc-600" }), /* @__PURE__ */ jsx("p", {
357
+ className: "mt-2 text-xs text-(--clarify-theme-tokens-colors-muted) dark:text-zinc-400",
358
+ children: t("search.noResults", { query })
359
+ })]
360
+ }) : null, results.length ? /* @__PURE__ */ jsx("ul", {
361
+ id: "clarify-search-results",
362
+ className: "clarify-search-results",
363
+ role: "listbox",
364
+ children: results.map((result, resultIndex) => /* @__PURE__ */ jsx(SearchResult, {
365
+ result,
366
+ query,
367
+ active: resultIndex === activeIndex,
368
+ onActive: () => setActiveIndex(resultIndex),
369
+ onSelect: () => selectResult(result)
370
+ }, result.type === "full-text" ? result.id : result.url))
371
+ }) : null]
372
+ });
373
+ }
374
+ return /* @__PURE__ */ jsxs(Dialog, {
375
+ open,
376
+ onClose: closeDialog,
377
+ className: clsx("clarify-search-dialog fixed inset-0 z-50", className),
378
+ children: [/* @__PURE__ */ jsx(DialogBackdrop, {
379
+ transition: true,
380
+ className: "clarify-search-backdrop clarify-ui-backdrop fixed inset-0 backdrop-blur-xs data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in"
381
+ }), /* @__PURE__ */ jsx("div", {
382
+ className: "fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-(--clarify-search-dialog-padding-block-lg)",
383
+ children: /* @__PURE__ */ jsxs(DialogPanel, {
384
+ transition: true,
385
+ className: "clarify-search-panel mx-auto transform-gpu overflow-hidden rounded-(--clarify-theme-tokens-radius-lg) bg-(--clarify-theme-tokens-colors-surface) shadow-xl ring-1 ring-(--clarify-theme-tokens-colors-border) data-closed:scale-95 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:max-w-xl dark:bg-zinc-900 dark:ring-zinc-800",
386
+ onKeyDown: (event) => {
387
+ if (event.key === "ArrowDown") {
388
+ event.preventDefault();
389
+ setActiveIndex((index) => results.length ? (index + 1) % results.length : 0);
390
+ }
391
+ if (event.key === "ArrowUp") {
392
+ event.preventDefault();
393
+ setActiveIndex((index) => results.length ? (index - 1 + results.length) % results.length : 0);
394
+ }
395
+ },
396
+ children: [/* @__PURE__ */ jsx(SearchInput, {
397
+ ref: inputRef,
398
+ query,
399
+ setQuery: updateQuery,
400
+ onClose: closeDialog,
401
+ onSubmit: () => selectResult(),
402
+ loading: searchInputLoading
403
+ }), renderResultsPanel()]
404
+ })
405
+ })]
406
+ });
407
+ }
408
+ //#endregion
409
+ export { SearchDialog, SearchDialog as default };
410
+
411
+ //# sourceMappingURL=SearchDialog-CxYLjRi5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchDialog-CxYLjRi5.js","names":[],"sources":["../source/shell/search/items.ts","../source/shell/search/pagefind.ts","../source/shell/search/SearchInput.tsx","../source/shell/search/Highlight.tsx","../source/shell/search/SearchResult.tsx","../source/shell/search/SearchDialog.tsx"],"sourcesContent":["import type { NavigationNode, RouteItem } from '../../types'\n\nimport type { SearchItem } from './types'\n\nfunction routeGroupTitles(navigation: NavigationNode[]) {\n const titles = new Map<string, string>()\n\n for (const node of navigation) {\n if (node.children?.length) {\n for (const child of node.children) {\n titles.set(child.path, node.title)\n }\n } else {\n titles.set(node.path, node.title)\n }\n }\n\n return titles\n}\n\nexport function buildSearchItems(routes: RouteItem[], navigation: NavigationNode[]): SearchItem[] {\n const groupTitles = routeGroupTitles(navigation)\n\n return routes.flatMap((route) => {\n // Skip bare alias routes (e.g., /path) from search to avoid duplicates in multilingual sites\n if (route.isBareAlias) return []\n \n const groupTitle = groupTitles.get(route.path)\n const pageItem: SearchItem = {\n title: route.title,\n pageTitle: route.title,\n sectionTitle: groupTitle,\n url: route.path,\n keywords: [groupTitle, route.title, route.path, route.kind].filter(Boolean).join(' ').toLowerCase(),\n }\n\n const sectionItems = route.sections?.map((section) => ({\n title: section.title,\n pageTitle: route.title,\n sectionTitle: groupTitle,\n url: `${route.path}#${section.id}`,\n keywords: [groupTitle, route.title, section.title, route.path, section.id].filter(Boolean).join(' ').toLowerCase(),\n })) ?? []\n\n return [pageItem, ...sectionItems]\n })\n}\n","import { prefixHref } from '../../utils/href'\n\nimport type { Pagefind } from './types'\n\ntype PagefindModule = {\n createInstance: () => Pagefind\n}\n\nconst pagefindPromises = new Map<string, Promise<Pagefind | null>>()\n\nexport function pagefindCacheKey(routePrefix: string, locale: string | undefined) {\n return `${routePrefix || '/'}:${locale || 'default'}`\n}\n\nexport function loadPagefind(routePrefix: string, locale: string | undefined): Promise<Pagefind | null> {\n if (typeof window === 'undefined') return Promise.resolve(null)\n\n const language = locale ?? document.documentElement.lang\n const cacheKey = pagefindCacheKey(routePrefix, language)\n const cachedPagefind = pagefindPromises.get(cacheKey)\n if (cachedPagefind) {\n return cachedPagefind\n }\n\n const pagefindUrl = prefixHref('/pagefind/pagefind.js', routePrefix)\n const pagefindPromise = import(/* @vite-ignore */ pagefindUrl)\n .then(async (module: PagefindModule) => {\n const previousLanguage = document.documentElement.lang\n if (language) document.documentElement.lang = language\n const pagefind = module.createInstance()\n if (previousLanguage && previousLanguage !== language) document.documentElement.lang = previousLanguage\n await pagefind.init?.()\n return pagefind\n })\n .catch((error: unknown) => {\n pagefindPromises.delete(cacheKey)\n console.warn('[clarify:search] Pagefind instance failed', { cacheKey, language, error })\n return null\n })\n\n pagefindPromises.set(cacheKey, pagefindPromise)\n return pagefindPromise\n}\n\nexport function normalizePagefindUrl(url: string, routePrefix: string): string {\n const parsedUrl = new URL(url, typeof window === 'undefined' ? 'http://localhost' : window.location.origin)\n let pathname = parsedUrl.pathname\n const prefix = routePrefix && routePrefix !== '/' ? `/${routePrefix.replace(/^\\/+|\\/+$/g, '')}` : ''\n\n if (prefix && (pathname === prefix || pathname.startsWith(`${prefix}/`))) {\n pathname = pathname.slice(prefix.length) || '/'\n }\n\n return `${pathname}${parsedUrl.search}${parsedUrl.hash}`\n}\n","import clsx from 'clsx'\nimport { LoaderCircle, Search as SearchIcon } from 'lucide-react'\nimport { forwardRef } from 'react'\n\nimport { useBuiltInText } from '../../i18n'\n\nexport const SearchInput = forwardRef<\n React.ElementRef<'input'>,\n {\n query: string\n setQuery: (query: string) => void\n onClose: () => void\n onSubmit: () => void\n activeDescendantId?: string\n loading?: boolean\n }\n>(function SearchInput(arg0, inputRef) {\n const { query, setQuery, onClose, onSubmit, activeDescendantId, loading = false } = arg0\n const t = useBuiltInText()\n const Icon = loading ? LoaderCircle : SearchIcon\n\n return (\n <div className=\"clarify-search-input group relative flex h-12\">\n <Icon\n aria-hidden=\"true\"\n className={clsx(\n 'pointer-events-none absolute top-0 left-3 h-full w-5 stroke-(--clarify-theme-tokens-colors-muted)',\n loading && 'animate-spin',\n )}\n />\n <input\n ref={inputRef}\n data-autofocus\n role=\"combobox\"\n aria-expanded={query !== ''}\n aria-controls=\"clarify-search-results\"\n aria-activedescendant={activeDescendantId}\n value={query}\n onChange={(event) => setQuery(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n if (query) setQuery('')\n else onClose()\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n onSubmit()\n }\n }}\n placeholder={t('search.placeholder')}\n className=\"clarify-search-field flex-auto appearance-none bg-transparent pr-4 pl-10 outline-hidden focus:w-full focus:flex-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden [&::-webkit-search-results-button]:hidden [&::-webkit-search-results-decoration]:hidden\"\n />\n </div>\n )\n})\n","import { Fragment } from 'react'\nimport type { ReactNode } from 'react'\n\nfunction stripHtml(value: string): string {\n if (typeof document === 'undefined') return value.replace(/<[^>]*>/g, '')\n const template = document.createElement('template')\n template.innerHTML = value\n return template.content.textContent ?? ''\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\ntype HighlightQueryProps = { text: string; query: string }\n\nexport function HighlightQuery(arg0: HighlightQueryProps) {\n const { text, query } = arg0\n\n if (!query) return text\n\n const parts = text.split(new RegExp(`(${escapeRegExp(query)})`, 'ig'))\n\n return (\n <>\n {parts.map((part, index) =>\n part.toLowerCase() === query.toLowerCase() ? (\n <mark key={index} className=\"bg-transparent text-(--clarify-theme-tokens-colors-primary) underline\">\n {part}\n </mark>\n ) : (\n <Fragment key={index}>{part}</Fragment>\n ),\n )}\n </>\n )\n}\n\nfunction renderExcerptNode(node: ChildNode, key: string): ReactNode {\n if (node.nodeType === Node.TEXT_NODE) return node.textContent\n if (node.nodeType !== Node.ELEMENT_NODE) return null\n\n const element = node as HTMLElement\n const children = Array.from(element.childNodes).map((child, index) => renderExcerptNode(child, `${key}-${index}`))\n\n if (element.tagName.toLowerCase() === 'mark') {\n return (\n <mark key={key} className=\"bg-transparent text-(--clarify-theme-tokens-colors-primary) underline\">\n {children}\n </mark>\n )\n }\n\n return <Fragment key={key}>{children}</Fragment>\n}\n\ntype HighlightExcerptProps = { excerpt: string; query: string }\n\nexport function HighlightExcerpt(arg0: HighlightExcerptProps) {\n const { excerpt, query } = arg0\n\n if (typeof document === 'undefined' || !excerpt.includes('<mark')) {\n return <HighlightQuery text={stripHtml(excerpt)} query={query} />\n }\n\n const template = document.createElement('template')\n template.innerHTML = excerpt\n\n return <>{Array.from(template.content.childNodes).map((node, index) => renderExcerptNode(node, String(index)))}</>\n}\n","import clsx from 'clsx'\nimport { Fragment, useId } from 'react'\n\nimport { HighlightExcerpt, HighlightQuery } from './Highlight'\nimport type { SearchDisplayItem } from './types'\n\ntype SearchResultProps = {\n result: SearchDisplayItem\n query: string\n active: boolean\n onActive: () => void\n onSelect: () => void\n}\n\nexport function SearchResult(arg0: SearchResultProps) {\n const { result, query, active, onActive, onSelect } = arg0\n const id = useId()\n const hierarchy = result.type === 'quick'\n ? [result.sectionTitle, result.pageTitle].filter((value): value is string => typeof value === 'string')\n : []\n\n return (\n <li\n id={id}\n className={clsx('clarify-search-result group block cursor-pointer px-4 py-3', active && 'clarify-search-result-active')}\n aria-selected={active}\n onMouseEnter={onActive}\n onMouseMove={onActive}\n onMouseDown={(event) => {\n event.preventDefault()\n onSelect()\n }}\n >\n <div className=\"clarify-search-result-title\">\n <HighlightQuery text={result.title} query={query} />\n </div>\n {hierarchy.length > 0 ? (\n <div className=\"clarify-search-result-hierarchy mt-1 truncate whitespace-nowrap\">\n {hierarchy.map((item, itemIndex, items) => (\n <Fragment key={`${item}-${itemIndex}`}>\n <HighlightQuery text={item} query={query} />\n <span className={itemIndex === items.length - 1 ? 'sr-only' : 'clarify-search-result-separator mx-2'}>/</span>\n </Fragment>\n ))}\n </div>\n ) : null}\n {result.type === 'full-text' && result.excerpt ? (\n <p className=\"clarify-search-result-excerpt mt-1 line-clamp-2 text-xs leading-5 text-(--clarify-theme-tokens-colors-muted)\">\n <HighlightExcerpt excerpt={result.excerpt} query={query} />\n </p>\n ) : null}\n </li>\n )\n}\n","import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react'\nimport clsx from 'clsx'\nimport { SearchX } from 'lucide-react'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { useBuiltInText } from '../../i18n'\nimport type { NavigationNode, RouteItem } from '../../types'\n\nimport { buildSearchItems } from './items'\nimport { loadPagefind, normalizePagefindUrl, pagefindCacheKey } from './pagefind'\nimport { SearchInput } from './SearchInput'\nimport { SearchResult } from './SearchResult'\nimport type { FullTextSearchItem, Pagefind, SearchDisplayItem } from './types'\n\ntype SearchDialogProps = {\n open: boolean\n setOpen: (open: boolean) => void\n routes: RouteItem[]\n navigation: NavigationNode[]\n routePrefix?: string\n currentLocale?: string\n className?: string\n onNavigate?: () => void\n}\n\ntype PagefindState = {\n key: string\n pagefind: Pagefind | null\n available: boolean\n}\n\ntype FullTextSearchState = {\n key: string\n results: FullTextSearchItem[] | null\n}\n\ntype UseSearchDialogLifecycleArgs = {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\nfunction useSearchDialogLifecycle(arg0: UseSearchDialogLifecycleArgs) {\n const { open, setOpen } = arg0\n const location = useLocation()\n\n useEffect(() => {\n setOpen(false)\n }, [location.pathname, location.search, location.hash, setOpen])\n\n useEffect(() => {\n if (typeof window === 'undefined') return undefined\n if (open) return undefined\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === 'k' && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n setOpen(true)\n }\n }\n\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [open, setOpen])\n}\n\ntype UseSearchDataArgs = {\n query: string\n searchItems: ReturnType<typeof buildSearchItems>\n routePrefix: string\n currentLocale?: string\n}\n\ntype SearchDataState = {\n results: SearchDisplayItem[]\n searchInputLoading: boolean\n showNoResults: boolean\n}\n\nfunction useSearchData(arg0: UseSearchDataArgs): SearchDataState {\n const { query, searchItems, routePrefix, currentLocale } = arg0\n const [fullTextState, setFullTextState] = useState<FullTextSearchState | null>(null)\n const [pagefindState, setPagefindState] = useState<PagefindState | null>(null)\n\n const quickResults = useMemo(() => {\n const normalizedQuery = query.trim().toLowerCase()\n if (!normalizedQuery) return []\n return searchItems.filter((item) => item.keywords.includes(normalizedQuery)).slice(0, 8).map((item) => ({ ...item, type: 'quick' as const }))\n }, [query, searchItems])\n\n const pagefindKey = pagefindCacheKey(routePrefix, currentLocale)\n const activePagefindState = pagefindState?.key === pagefindKey ? pagefindState : null\n const pagefind = activePagefindState?.pagefind ?? null\n const pagefindAvailable = activePagefindState?.available ?? null\n const trimmedQuery = query.trim()\n const fullTextKey = `${pagefindKey}:${trimmedQuery}`\n const fullTextResults = fullTextState?.key === fullTextKey ? fullTextState.results : null\n const results: SearchDisplayItem[] = fullTextResults ?? quickResults\n const searchInputLoading = pagefindAvailable === null || Boolean(trimmedQuery && pagefind && fullTextState?.key !== fullTextKey)\n const showNoResults = Boolean(query.trim()) && results.length === 0 && pagefindAvailable !== null\n\n useEffect(() => {\n let cancelled = false\n\n loadPagefind(routePrefix, currentLocale).then((loadedPagefind) => {\n if (cancelled) return\n setPagefindState({ key: pagefindKey, pagefind: loadedPagefind, available: Boolean(loadedPagefind) })\n })\n\n return () => {\n cancelled = true\n }\n }, [currentLocale, pagefindKey, routePrefix])\n\n useEffect(() => {\n let cancelled = false\n if (!trimmedQuery || !pagefind) return undefined\n\n Promise.resolve().then(async () => {\n if (cancelled) return\n\n try {\n const search = await pagefind.search(trimmedQuery, { limit: 8 })\n const data = await Promise.all(search.results.map(async (result) => ({ id: result.id, data: await result.data() })))\n if (cancelled) return\n setFullTextState({\n key: fullTextKey,\n results: data.map(({ id, data }) => ({\n type: 'full-text',\n id,\n title: data.meta.title || data.url,\n url: normalizePagefindUrl(data.url, routePrefix),\n excerpt: data.excerpt,\n })),\n })\n } catch (error: unknown) {\n console.warn('[clarify:search] Pagefind search failed', { currentLocale, query: trimmedQuery, error })\n if (!cancelled) setFullTextState({ key: fullTextKey, results: null })\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [currentLocale, fullTextKey, pagefind, routePrefix, trimmedQuery])\n\n return {\n results,\n searchInputLoading,\n showNoResults,\n }\n}\n\nexport function SearchDialog(arg0: SearchDialogProps) {\n const {\n open,\n setOpen,\n routes,\n navigation,\n routePrefix = '/',\n currentLocale,\n className,\n onNavigate = () => {},\n } = arg0\n\n const t = useBuiltInText()\n const navigate = useNavigate()\n const inputRef = useRef<React.ElementRef<typeof SearchInput>>(null)\n const [query, setQuery] = useState('')\n const [activeIndex, setActiveIndex] = useState(0)\n const searchItems = useMemo(() => buildSearchItems(routes, navigation), [navigation, routes])\n\n useSearchDialogLifecycle({ open, setOpen })\n const { results, searchInputLoading, showNoResults } = useSearchData({ query, searchItems, routePrefix, currentLocale })\n\n const updateQuery = (value: string) => {\n setQuery(value)\n setActiveIndex(0)\n }\n\n function closeDialog() {\n updateQuery('')\n setOpen(false)\n }\n\n function selectResult(result = results[activeIndex]) {\n if (!result) return\n navigate(result.url)\n onNavigate()\n closeDialog()\n }\n\n function renderResultsPanel() {\n return (\n <div className=\"border-t border-(--clarify-theme-tokens-colors-border) bg-(--clarify-theme-tokens-colors-background) empty:hidden dark:border-zinc-100/5 dark:bg-white/2.5\">\n {showNoResults ? (\n <div className=\"p-6 text-center\">\n <SearchX className=\"mx-auto h-5 w-5 stroke-(--clarify-theme-tokens-colors-foreground) dark:stroke-zinc-600\" />\n <p className=\"mt-2 text-xs text-(--clarify-theme-tokens-colors-muted) dark:text-zinc-400\">\n {t('search.noResults', { query })}\n </p>\n </div>\n ) : null}\n {results.length ? (\n <ul id=\"clarify-search-results\" className=\"clarify-search-results\" role=\"listbox\">\n {results.map((result, resultIndex) => (\n <SearchResult\n key={result.type === 'full-text' ? result.id : result.url}\n result={result}\n query={query}\n active={resultIndex === activeIndex}\n onActive={() => setActiveIndex(resultIndex)}\n onSelect={() => selectResult(result)}\n />\n ))}\n </ul>\n ) : null}\n </div>\n )\n }\n\n return (\n <Dialog open={open} onClose={closeDialog} className={clsx('clarify-search-dialog fixed inset-0 z-50', className)}>\n <DialogBackdrop\n transition\n className=\"clarify-search-backdrop clarify-ui-backdrop fixed inset-0 backdrop-blur-xs data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n\n <div className=\"fixed inset-0 overflow-y-auto px-4 py-4 sm:px-6 sm:py-20 md:py-32 lg:px-8 lg:py-(--clarify-search-dialog-padding-block-lg)\">\n <DialogPanel\n transition\n className=\"clarify-search-panel mx-auto transform-gpu overflow-hidden rounded-(--clarify-theme-tokens-radius-lg) bg-(--clarify-theme-tokens-colors-surface) shadow-xl ring-1 ring-(--clarify-theme-tokens-colors-border) data-closed:scale-95 data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in sm:max-w-xl dark:bg-zinc-900 dark:ring-zinc-800\"\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActiveIndex((index) => (results.length ? (index + 1) % results.length : 0))\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActiveIndex((index) => (results.length ? (index - 1 + results.length) % results.length : 0))\n }\n }}\n >\n <SearchInput\n ref={inputRef}\n query={query}\n setQuery={updateQuery}\n onClose={closeDialog}\n onSubmit={() => selectResult()}\n loading={searchInputLoading}\n />\n {renderResultsPanel()}\n </DialogPanel>\n </div>\n </Dialog>\n )\n}\n\nexport default SearchDialog\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { RuntimeSlots } from '../slots';
1
+ import { RuntimeSlotRegistry } from '../slots';
2
2
  import { RouteItem, Config, NavigationTree } from '../types';
3
3
  export type AppShellProps = {
4
4
  config: Config;
5
5
  routes: RouteItem[];
6
6
  navigation: NavigationTree;
7
- runtimeSlots?: RuntimeSlots;
7
+ runtimeSlots?: RuntimeSlotRegistry;
8
8
  };
9
9
  export declare function AppShell(arg0: AppShellProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { RefObject } from 'react';
2
+ type SectionHashSyncProps = {
3
+ hashScrollSuppressedUntilRef: RefObject<number>;
4
+ };
5
+ export declare function SectionHashSync(arg0: SectionHashSyncProps): null;
6
+ export {};
package/output/client.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_PageActions = require("./PageActions-CTn2XkPg.cjs");
3
- const require_ClarifyShell = require("./ClarifyShell-7r92MZg9.cjs");
4
- const require_render = require("./render-DXDSIfZ8.cjs");
2
+ const require_ClarifyShell = require("./ClarifyShell-C6li72Ce.cjs");
3
+ const require_PageActions = require("./PageActions-BjB6PYmL.cjs");
4
+ const require_render = require("./render-Di5B6Zc0.cjs");
5
5
  exports.ThemeEditor = require_ClarifyShell.ThemeEditor;
6
6
  exports.applyThemeVariables = require_ClarifyShell.applyThemeVariables;
7
7
  exports.getStoredLocalePreference = require_PageActions.getStoredLocalePreference;
package/output/client.js CHANGED
@@ -1,4 +1,4 @@
1
- import { S as themeCookieName, _ as getStoredThemePreference, b as storeLocalePreference, g as getStoredLocalePreference, v as localeCookieName, x as storeThemePreference, y as readLocaleCookie } from "./PageActions-D0PA8Zv5.js";
2
- import { a as themeBootstrapScript, i as themeEditorPresets, n as ThemeEditor, r as applyThemeVariables, s as themeStorageKey } from "./ClarifyShell-D2P0iZ_m.js";
3
- import { t as render } from "./render-CwSsfrs7.js";
1
+ import { a as themeBootstrapScript, i as themeEditorPresets, n as ThemeEditor, r as applyThemeVariables, s as themeStorageKey } from "./ClarifyShell-1LuBliwt.js";
2
+ import { S as themeCookieName, _ as getStoredThemePreference, b as storeLocalePreference, g as getStoredLocalePreference, v as localeCookieName, x as storeThemePreference, y as readLocaleCookie } from "./PageActions-D7K9LDGf.js";
3
+ import { t as render } from "./render-DKj24Jqw.js";
4
4
  export { ThemeEditor, applyThemeVariables, getStoredLocalePreference, getStoredThemePreference, localeCookieName, readLocaleCookie, render, storeLocalePreference, storeThemePreference, themeBootstrapScript, themeCookieName, themeEditorPresets, themeStorageKey };
@@ -0,0 +1,7 @@
1
+ import { ReactNode } from 'react';
2
+ type MermaidViewerProps = {
3
+ svg: string;
4
+ className?: string;
5
+ };
6
+ export declare function MermaidViewer(arg0: MermaidViewerProps): ReactNode;
7
+ export default MermaidViewer;
@@ -1 +1 @@
1
- export { LocaleContext, OpenApisContext, useLocale, useOpenApis } from './core/context';
1
+ export { LocaleContext, OpenApiSpecsContext, useLocale, useOpenApiSpecs } from './core/context';
@@ -1,9 +1,8 @@
1
- import { OpenAPISpec } from '../openapi/lib/utils';
2
- import { Config } from './types';
1
+ import { Config, OpenApiRegistry } from './types';
3
2
  export declare const ConfigContext: import('react').Context<Config | null>;
4
3
  export declare const LocaleContext: import('react').Context<string | undefined>;
5
- export declare const OpenApisContext: import('react').Context<Record<string, OpenAPISpec>>;
4
+ export declare const OpenApiSpecsContext: import('react').Context<OpenApiRegistry>;
6
5
  export declare function useConfig(): Config;
7
6
  export declare function useConfigOptional(): Config | null;
8
7
  export declare function useLocale(): string | undefined;
9
- export declare function useOpenApis(): Record<string, OpenAPISpec>;
8
+ export declare function useOpenApiSpecs(): OpenApiRegistry;
@@ -1,5 +1,5 @@
1
1
  export type BuiltInLocale = 'en' | 'zh-CN';
2
- export type BuiltInTextKey = 'actions.code' | 'actions.copy' | 'actions.copied' | 'builtWith.label' | 'builtWith.prefix' | 'callout.danger' | 'callout.info' | 'callout.note' | 'callout.success' | 'callout.tip' | 'callout.warning' | 'contentActions.copyContent' | 'contentActions.copyContentDescription' | 'contentActions.copyLink' | 'contentActions.copyLinkDescription' | 'contentActions.copyLlms' | 'contentActions.copyLlmsDescription' | 'contentActions.copiedLlms' | 'contentActions.editPage' | 'contentActions.editPageDescription' | 'contentActions.copyOptions' | 'contentActions.copiedContent' | 'contentActions.copiedLink' | 'contentActions.viewMarkdown' | 'contentActions.viewMarkdownDescription' | 'contentActions.viewOpenApi' | 'contentActions.viewOpenApiDescription' | 'feedback.no' | 'feedback.prompt' | 'feedback.thanks' | 'feedback.yes' | 'navigation.documentation' | 'navigation.next' | 'navigation.previous' | 'navigation.previousNext' | 'navigation.toggle' | 'navbar.home' | 'navbar.openLinks' | 'navbar.sections' | 'notFound.description' | 'notFound.home' | 'notFound.label' | 'notFound.title' | 'openapi.apiDocumentation' | 'openapi.bodyProperties' | 'openapi.collapse' | 'openapi.endpointNotFound' | 'openapi.example' | 'openapi.expand' | 'openapi.headers' | 'openapi.language' | 'openapi.client' | 'openapi.mediaType' | 'openapi.none' | 'openapi.openApiReference' | 'openapi.operationParameter' | 'openapi.optional' | 'openapi.parameter' | 'openapi.pathParameters' | 'openapi.queryParameters' | 'openapi.request' | 'openapi.requestBody' | 'openapi.responseBodyProperties' | 'openapi.required' | 'openapi.requiredBadge' | 'openapi.response' | 'openapi.responses' | 'openapi.schemaExample' | 'openapi.scrollExamplesLeft' | 'openapi.scrollExamplesRight' | 'openapi.specNotFound' | 'openapi.specPathMissing' | 'openapi.status' | 'openapi.version' | 'search.button' | 'search.noResults' | 'search.placeholder' | 'search.shortcutCtrl' | 'renderError.componentStack' | 'renderError.description' | 'renderError.details' | 'renderError.message' | 'renderError.path' | 'renderError.reload' | 'renderError.stack' | 'renderError.title' | 'renderError.version' | 'renderError.type' | 'theme.switchToDark' | 'theme.switchToLight' | 'theme.switchToSystem' | 'language.switch' | 'mermaid.zoomIn' | 'mermaid.zoomOut' | 'mermaid.resetZoom' | 'mermaid.renderError' | 'mermaid.scrollHint';
2
+ export type BuiltInTextKey = 'actions.code' | 'actions.copy' | 'actions.copied' | 'builtWith.label' | 'builtWith.prefix' | 'callout.danger' | 'callout.info' | 'callout.note' | 'callout.success' | 'callout.tip' | 'callout.warning' | 'contentActions.copyContent' | 'contentActions.copyContentDescription' | 'contentActions.copyLink' | 'contentActions.copyLinkDescription' | 'contentActions.copyLlms' | 'contentActions.copyLlmsDescription' | 'contentActions.copiedLlms' | 'contentActions.editPage' | 'contentActions.editPageDescription' | 'contentActions.copyOptions' | 'contentActions.copiedContent' | 'contentActions.copiedLink' | 'contentActions.viewMarkdown' | 'contentActions.viewMarkdownDescription' | 'contentActions.viewOpenApi' | 'contentActions.viewOpenApiDescription' | 'feedback.no' | 'feedback.prompt' | 'feedback.thanks' | 'feedback.yes' | 'navigation.documentation' | 'navigation.next' | 'navigation.previous' | 'navigation.previousNext' | 'navigation.toggle' | 'navbar.home' | 'navbar.openLinks' | 'navbar.sections' | 'notFound.description' | 'notFound.home' | 'notFound.label' | 'notFound.title' | 'openapi.apiDocumentation' | 'openapi.bodyProperties' | 'openapi.collapse' | 'openapi.endpointNotFound' | 'openapi.example' | 'openapi.expand' | 'openapi.headers' | 'openapi.language' | 'openapi.client' | 'openapi.loading' | 'openapi.mediaType' | 'openapi.none' | 'openapi.openApiReference' | 'openapi.operationParameter' | 'openapi.optional' | 'openapi.parameter' | 'openapi.pathParameters' | 'openapi.queryParameters' | 'openapi.request' | 'openapi.requestBody' | 'openapi.requestBodyEmpty' | 'openapi.responseBodyProperties' | 'openapi.required' | 'openapi.requiredBadge' | 'openapi.response' | 'openapi.responses' | 'openapi.schemaExample' | 'openapi.scrollExamplesLeft' | 'openapi.scrollExamplesRight' | 'openapi.specNotFound' | 'openapi.specPathMissing' | 'openapi.status' | 'openapi.version' | 'openapi.webhookResponse' | 'openapi.webhookResponses' | 'search.button' | 'search.noResults' | 'search.placeholder' | 'search.shortcutCtrl' | 'renderError.componentStack' | 'renderError.description' | 'renderError.details' | 'renderError.message' | 'renderError.path' | 'renderError.reload' | 'renderError.stack' | 'renderError.title' | 'renderError.version' | 'renderError.type' | 'theme.switchToDark' | 'theme.switchToLight' | 'theme.switchToSystem' | 'language.switch' | 'mermaid.zoomIn' | 'mermaid.zoomOut' | 'mermaid.resetZoom' | 'mermaid.renderError' | 'mermaid.scrollHint';
3
3
  export declare function resolveBuiltInLocale(locale?: string): BuiltInLocale;
4
4
  export declare function translateBuiltInText(locale: string | undefined, key: BuiltInTextKey, replacements?: Record<string, string>): string;
5
5
  export declare function useBuiltInText(locale?: string): (key: BuiltInTextKey, replacements?: Record<string, string>) => string;
@@ -1,3 +1,3 @@
1
- export { ConfigContext, LocaleContext, OpenApisContext, useConfig, useOpenApis } from './context';
1
+ export { ConfigContext, LocaleContext, OpenApiSpecsContext, useConfig, useOpenApiSpecs } from './context';
2
2
  export { resolveBuiltInLocale, translateBuiltInText, useBuiltInText } from './i18n';
3
3
  export type * from './types';