@clarify-labs/renderer 0.7.0 → 0.7.2

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 (64) hide show
  1. package/output/{OpenApiOperation-ZXToVSFC.cjs → OpenApiOperation-BcyW_ULy.cjs} +186 -140
  2. package/output/OpenApiOperation-BcyW_ULy.cjs.map +1 -0
  3. package/output/{OpenApiOperation-CWSOhUVa.js → OpenApiOperation-tUKf7lZ4.js} +166 -120
  4. package/output/OpenApiOperation-tUKf7lZ4.js.map +1 -0
  5. package/output/{shell-xxhV0p7k.cjs → PageActions-1RDCHcUY.cjs} +280 -308
  6. package/output/PageActions-1RDCHcUY.cjs.map +1 -0
  7. package/output/{shell-CumiARRe.js → PageActions-yoDRjkq8.js} +235 -263
  8. package/output/PageActions-yoDRjkq8.js.map +1 -0
  9. package/output/{ThemeRoot-C_ZdzSMu.js → ThemeRoot-QULrwQf6.js} +407 -53
  10. package/output/ThemeRoot-QULrwQf6.js.map +1 -0
  11. package/output/{ThemeRoot-CEvwrGp5.cjs → ThemeRoot-UWj0iK1X.cjs} +458 -80
  12. package/output/ThemeRoot-UWj0iK1X.cjs.map +1 -0
  13. package/output/app/AppShell.d.ts +3 -2
  14. package/output/app/PageActions.d.ts +12 -0
  15. package/output/app/PageBanner.d.ts +7 -0
  16. package/output/app/SectionProvider.d.ts +1 -0
  17. package/output/client.cjs +14 -7
  18. package/output/client.d.ts +4 -2
  19. package/output/client.js +4 -4
  20. package/output/context.d.ts +1 -1
  21. package/output/core/context.d.ts +5 -5
  22. package/output/core/index.d.ts +1 -1
  23. package/output/core/types.d.ts +70 -61
  24. package/output/index.cjs +56 -28
  25. package/output/index.cjs.map +1 -1
  26. package/output/index.d.ts +7 -5
  27. package/output/index.js +37 -12
  28. package/output/index.js.map +1 -1
  29. package/output/mdx/components.d.ts +2 -0
  30. package/output/mdx/primitives.d.ts +2 -0
  31. package/output/openapi/components/EndpointSections.d.ts +30 -0
  32. package/output/preview.cjs +7 -7
  33. package/output/preview.cjs.map +1 -1
  34. package/output/preview.js +4 -4
  35. package/output/preview.js.map +1 -1
  36. package/output/{render-zHU25Nm9.cjs → render-ByWbJbrA.cjs} +8 -7
  37. package/output/render-ByWbJbrA.cjs.map +1 -0
  38. package/output/{render-CnUd0XwZ.js → render-psutGbsg.js} +6 -5
  39. package/output/render-psutGbsg.js.map +1 -0
  40. package/output/renderer.css +371 -269
  41. package/output/server.cjs +8 -7
  42. package/output/server.cjs.map +1 -1
  43. package/output/server.js +5 -4
  44. package/output/server.js.map +1 -1
  45. package/output/shell/ContentActions.d.ts +0 -1
  46. package/output/shell/Header.d.ts +3 -2
  47. package/output/shell/SiteLogo.d.ts +2 -2
  48. package/output/shell/mobile.d.ts +2 -2
  49. package/output/theme/ThemeEditor.d.ts +53 -17
  50. package/output/theme/ThemeProvider.d.ts +2 -1
  51. package/output/theme/ThemeRoot.d.ts +2 -2
  52. package/output/theme/cookies.d.ts +11 -0
  53. package/output/theme/randomTheme.d.ts +2 -2
  54. package/output/theme/variables.d.ts +58 -20
  55. package/output/utils/href.d.ts +3 -3
  56. package/package.json +1 -1
  57. package/output/OpenApiOperation-CWSOhUVa.js.map +0 -1
  58. package/output/OpenApiOperation-ZXToVSFC.cjs.map +0 -1
  59. package/output/ThemeRoot-CEvwrGp5.cjs.map +0 -1
  60. package/output/ThemeRoot-C_ZdzSMu.js.map +0 -1
  61. package/output/render-CnUd0XwZ.js.map +0 -1
  62. package/output/render-zHU25Nm9.cjs.map +0 -1
  63. package/output/shell-CumiARRe.js.map +0 -1
  64. package/output/shell-xxhV0p7k.cjs.map +0 -1
@@ -1,12 +1,13 @@
1
1
  import { ComponentType } from 'react';
2
2
  import { OpenAPISpec } from '../openapi/lib/utils';
3
- export type ClarifyFooterComponentPath = string;
3
+ export type FooterComponentPath = string;
4
4
  export type RouteComponent = ComponentType | (() => Promise<{
5
5
  default: ComponentType;
6
6
  }>);
7
7
  export type RouteSection = {
8
8
  id: string;
9
9
  title: string;
10
+ level?: number;
10
11
  badge?: string;
11
12
  tags?: string[];
12
13
  };
@@ -33,123 +34,127 @@ export type RouteItem = {
33
34
  contentArtifactUrl?: string;
34
35
  sourceUrl?: string;
35
36
  };
36
- export type ClarifyLogoConfig = string | {
37
+ export type LogoConfig = string | {
37
38
  light?: string;
38
39
  dark?: string;
39
40
  };
40
- export type ClarifyFaviconConfig = string | {
41
+ export type FaviconConfig = string | {
41
42
  light?: string;
42
43
  dark?: string;
43
44
  };
44
- export type ClarifyLocalizedText = string | Record<string, string>;
45
- export type ClarifyLocaleConfig = {
45
+ export type LocalizedText = string | Record<string, string>;
46
+ export type LocaleConfig = {
46
47
  code: string;
47
48
  label: string;
48
49
  dir?: 'ltr' | 'rtl';
49
50
  };
50
- export type ClarifyI18nConfig = {
51
+ export type I18nConfig = {
51
52
  defaultLocale: string;
52
53
  missing: 'fallback' | '404' | 'hide';
53
- locales: ClarifyLocaleConfig[];
54
+ locales: LocaleConfig[];
54
55
  };
55
- export type ClarifyNavbarLink = {
56
- label: ClarifyLocalizedText;
56
+ export type NavbarLink = {
57
+ label: LocalizedText;
57
58
  href: string;
58
59
  external?: boolean;
59
60
  };
60
- export type ClarifyBannerConfig = {
61
- content: ClarifyLocalizedText;
61
+ export type BannerComponentPath = string;
62
+ export type BannerConfigOptions = {
63
+ content: LocalizedText;
62
64
  dismissible?: boolean;
65
+ link?: NavbarLink;
63
66
  };
64
- export type ClarifyFooterLinksConfig = {
65
- links?: ClarifyNavbarLink[];
67
+ export type BannerConfig = BannerConfigOptions | BannerComponentPath;
68
+ export type FooterLinksConfig = {
69
+ links?: NavbarLink[];
66
70
  socials?: Record<string, string>;
67
- copyright?: ClarifyLocalizedText;
71
+ copyright?: LocalizedText;
68
72
  };
69
- export type ClarifyFooterConfig = ClarifyFooterLinksConfig | ClarifyFooterComponentPath;
70
- export type ClarifySourceConfig = {
73
+ export type FooterConfig = FooterLinksConfig | FooterComponentPath;
74
+ export type SourceConfig = {
71
75
  repository: string;
72
76
  branch?: string;
73
77
  directory?: string;
74
78
  };
75
- export type ClarifyThemePreset = 'default' | 'base';
76
- export type ClarifyThemeModeColorValue = {
79
+ export type ThemePreset = 'default' | 'base';
80
+ export type ThemeModeColorValue = {
77
81
  light?: string;
78
82
  dark?: string;
79
83
  };
80
- export type ClarifyThemeColorValue = string | ClarifyThemeModeColorValue;
81
- export type ClarifyThemeColorTokensConfig = {
82
- primary: ClarifyThemeColorValue;
83
- accent: ClarifyThemeColorValue;
84
- background: ClarifyThemeColorValue;
85
- foreground: ClarifyThemeColorValue;
86
- surface: ClarifyThemeColorValue;
87
- muted: ClarifyThemeColorValue;
88
- border: ClarifyThemeColorValue;
89
- codeBackground: ClarifyThemeColorValue;
90
- };
91
- export type ClarifyThemeRadiusTokensConfig = {
84
+ export type ThemeColorValue = string | ThemeModeColorValue;
85
+ export type ThemeColorTokensConfig = {
86
+ primary: ThemeColorValue;
87
+ accent: ThemeColorValue;
88
+ background: ThemeColorValue;
89
+ foreground: ThemeColorValue;
90
+ surface: ThemeColorValue;
91
+ muted: ThemeColorValue;
92
+ border: ThemeColorValue;
93
+ codeBackground: ThemeColorValue;
94
+ };
95
+ export type ThemeRadiusTokensConfig = {
92
96
  sm: string;
93
97
  md: string;
94
98
  lg: string;
95
99
  xl: string;
96
100
  };
97
- export type ClarifyThemeTokensConfig = {
98
- colors: ClarifyThemeColorTokensConfig;
99
- radius: ClarifyThemeRadiusTokensConfig;
101
+ export type ThemeTokensConfig = {
102
+ colors: ThemeColorTokensConfig;
103
+ radius: ThemeRadiusTokensConfig;
100
104
  };
101
- export type ClarifyThemeLayoutConfig = {
105
+ export type ThemeLayoutConfig = {
102
106
  maxWidth: string;
103
107
  };
104
- export type ClarifyThemeConfig = {
105
- preset: ClarifyThemePreset;
106
- tokens: ClarifyThemeTokensConfig;
107
- layout: ClarifyThemeLayoutConfig;
108
+ export type ThemeConfig = {
109
+ preset: ThemePreset;
110
+ tokens: ThemeTokensConfig;
111
+ layout: ThemeLayoutConfig;
108
112
  editor: boolean;
109
113
  };
110
- export type ClarifyPagesItem = string | {
114
+ export type PagesItem = string | {
111
115
  page: string;
112
- title?: ClarifyLocalizedText;
116
+ title?: LocalizedText;
113
117
  icon?: string;
114
118
  redirect?: string;
115
119
  } | {
116
120
  openapi: string;
117
121
  icon?: string;
118
- title?: ClarifyLocalizedText;
122
+ title?: LocalizedText;
119
123
  filter?: {
120
124
  tags?: string[];
121
125
  };
122
126
  };
123
- export type ClarifyPagesGroup = {
124
- group: ClarifyLocalizedText;
127
+ export type PagesGroup = {
128
+ group: LocalizedText;
125
129
  icon?: string;
126
- pages: ClarifyPagesItem[];
130
+ pages: PagesItem[];
127
131
  };
128
- export type ClarifyPagesConfig = ClarifyPagesGroup[] | 'FileTree';
129
- export type ClarifyTabItem = {
130
- tab: ClarifyLocalizedText;
132
+ export type PagesConfig = PagesGroup[] | 'FileTree';
133
+ export type TabItem = {
134
+ tab: LocalizedText;
131
135
  icon?: string;
132
- pages?: ClarifyPagesConfig;
136
+ pages?: PagesConfig;
133
137
  };
134
- export type ClarifyTabsConfig = ClarifyTabItem[];
135
- export type ClarifyConfig = {
138
+ export type TabsConfig = TabItem[];
139
+ export type Config = {
136
140
  title: string;
137
- logo?: ClarifyLogoConfig;
138
- favicon?: ClarifyFaviconConfig;
139
- theme: ClarifyThemeConfig;
141
+ logo?: LogoConfig;
142
+ homeUrl?: string;
143
+ favicon?: FaviconConfig;
144
+ theme: ThemeConfig;
140
145
  description: string;
141
146
  siteUrl?: string;
142
- source?: ClarifySourceConfig;
147
+ source?: SourceConfig;
143
148
  rootDirectory: string;
144
149
  routePrefix: string;
145
150
  outputDirectory: string;
146
151
  navbar?: {
147
- links?: ClarifyNavbarLink[];
152
+ links?: NavbarLink[];
148
153
  };
149
- banner?: ClarifyBannerConfig;
150
- footer?: ClarifyFooterConfig;
151
- i18n?: ClarifyI18nConfig;
152
- tabs?: ClarifyTabsConfig;
154
+ banner?: BannerConfig;
155
+ footer?: FooterConfig;
156
+ i18n?: I18nConfig;
157
+ tabs?: TabsConfig;
153
158
  };
154
159
  export type NavigationTab = {
155
160
  type: 'tab';
@@ -166,13 +171,15 @@ export type LocalizedTabbedNavigation = Record<string, TabbedNavigation>;
166
171
  export type NavigationTree = NavigationNode[] | LocalizedNavigation | TabbedNavigation | LocalizedTabbedNavigation;
167
172
  export type RenderOptions = {
168
173
  /** 从 virtual:clarify-config 导入的 config */
169
- config: ClarifyConfig;
174
+ config: Config;
170
175
  /** 从 virtual:clarify-routes 导入的路由数组 */
171
176
  routes: RouteItem[];
172
177
  /** 从 virtual:clarify-routes 导入的导航树;启用 i18n 时为按 locale 分组的导航树 */
173
178
  navigation?: NavigationTree;
174
179
  /** 从 virtual:clarify-openapi-registry 导入的 OpenAPI 规范表 */
175
180
  openApis?: Record<string, OpenAPISpec>;
181
+ /** Custom banner component imported from a configured banner path. */
182
+ bannerComponent?: ComponentType;
176
183
  /** Custom footer component imported from a configured footer path. */
177
184
  footerComponent?: ComponentType;
178
185
  /** Whether to render the live theme editor inside the app tree. */
@@ -185,13 +192,15 @@ export type ServerRouteItem = Omit<RouteItem, 'component'> & {
185
192
  };
186
193
  export type ServerRenderOptions = {
187
194
  /** 从 virtual:clarify-config 导入的 config */
188
- config: ClarifyConfig;
195
+ config: Config;
189
196
  /** 从 virtual:clarify-routes 导入的服务端路由数组 */
190
197
  routes: ServerRouteItem[];
191
198
  /** 从 virtual:clarify-routes 导入的导航树;启用 i18n 时为按 locale 分组的导航树 */
192
199
  navigation?: NavigationTree;
193
200
  /** 从 virtual:clarify-openapi-registry 导入的 OpenAPI 规范表 */
194
201
  openApis?: Record<string, OpenAPISpec>;
202
+ /** Custom banner component imported from a configured banner path. */
203
+ bannerComponent?: ComponentType;
195
204
  /** Custom footer component imported from a configured footer path. */
196
205
  footerComponent?: ComponentType;
197
206
  /** Whether to render the live theme editor inside the app tree. */
package/output/index.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_shell = require("./shell-xxhV0p7k.cjs");
3
- const require_ThemeRoot = require("./ThemeRoot-CEvwrGp5.cjs");
4
- const require_OpenApiOperation = require("./OpenApiOperation-ZXToVSFC.cjs");
2
+ const require_PageActions = require("./PageActions-1RDCHcUY.cjs");
3
+ const require_ThemeRoot = require("./ThemeRoot-UWj0iK1X.cjs");
4
+ const require_OpenApiOperation = require("./OpenApiOperation-BcyW_ULy.cjs");
5
5
  const require_remark = require("./remark-Dv3owbSH.cjs");
6
- const require_render = require("./render-zHU25Nm9.cjs");
6
+ const require_render = require("./render-ByWbJbrA.cjs");
7
7
  let react_router_dom = require("react-router-dom");
8
8
  let react_jsx_runtime = require("react/jsx-runtime");
9
9
  //#region source/openapi/lib/spec-path.ts
@@ -23,13 +23,32 @@ function normalizeSpecPath(specPath, currentRoutePath, routePrefix = "") {
23
23
  const fromDir = currentRoutePath === "/" ? "" : currentRoutePath?.replace(/^\//, "").replace(/\/[^/]*$/, "") ?? "";
24
24
  return VIRTUAL_PREFIX + resolveRelativePath(normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`) ? fromDir.slice(normalizedRoutePrefix.length + 1) : fromDir, normalizedSpecPath);
25
25
  }
26
+ /**
27
+ * 为绝对 specPath 生成带 locale 前缀的候选模块 ID。
28
+ *
29
+ * 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。
30
+ * 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec
31
+ * 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀
32
+ * 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。
33
+ */
34
+ function localizeSpecModuleId(moduleId, specPath, locale, defaultLocale) {
35
+ if (!locale || locale === defaultLocale) return void 0;
36
+ if (!specPath.startsWith("/") || specPath.startsWith(VIRTUAL_PREFIX)) return void 0;
37
+ const rest = moduleId.slice(21);
38
+ if (rest.startsWith(`${locale}/`) || rest === locale) return void 0;
39
+ return `${VIRTUAL_PREFIX}${locale}/${rest}`;
40
+ }
26
41
  function useOpenApiSpec(spec, specPath) {
27
- const specs = require_shell.useOpenApis();
42
+ const specs = require_PageActions.useOpenApis();
28
43
  const location = (0, react_router_dom.useLocation)();
29
- const config = require_shell.useClarifyConfig();
44
+ const config = require_PageActions.useConfig();
45
+ const locale = require_PageActions.useLocale();
30
46
  if (spec) return spec;
31
47
  if (!specPath) return null;
32
- return specs[normalizeSpecPath(specPath, location.pathname, config.routePrefix)] ?? null;
48
+ const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix);
49
+ const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale);
50
+ if (localized && specs[localized]) return specs[localized];
51
+ return specs[normalized] ?? null;
33
52
  }
34
53
  //#endregion
35
54
  //#region source/openapi/lib/utils.ts
@@ -83,21 +102,27 @@ function listOpenApiOperations(spec) {
83
102
  //#region source/openapi/entry.tsx
84
103
  function OpenApiHeader(arg0) {
85
104
  const { spec } = arg0;
86
- const t = require_shell.useBuiltInText();
105
+ const t = require_PageActions.useBuiltInText();
87
106
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("header", {
88
- className: "mb-16",
107
+ className: "clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8",
89
108
  children: [
90
109
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
91
- className: "mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400",
110
+ className: "mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase",
92
111
  children: t("openapi.openApiReference")
93
112
  }),
94
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", { children: spec.info?.title ?? t("openapi.apiDocumentation") }),
113
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
114
+ className: "clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
115
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h1", {
116
+ className: "clarify-page-title min-w-0 flex-1",
117
+ children: spec.info?.title ?? t("openapi.apiDocumentation")
118
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PageActions.PageTitleActions, {})]
119
+ }),
95
120
  spec.info?.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OpenApiOperation.Markdown, {
96
- className: "lead *:first:mt-0 *:last:mb-0",
121
+ className: "lead mt-4 *:first:mt-0 *:last:mb-0",
97
122
  children: spec.info.description
98
123
  }) : null,
99
124
  spec.info?.version ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
100
- className: "text-sm text-zinc-500 dark:text-zinc-400",
125
+ className: "mt-4 text-sm text-(--clarify-ui-text-faint)",
101
126
  children: t("openapi.version", { version: spec.info.version })
102
127
  }) : null
103
128
  ]
@@ -132,7 +157,7 @@ function WarningBox(arg0) {
132
157
  }
133
158
  function OpenApiDocument(arg0) {
134
159
  const { spec, specPath, tagFilter } = arg0;
135
- const t = require_shell.useBuiltInText();
160
+ const t = require_PageActions.useBuiltInText();
136
161
  const resolved = useOpenApiSpec(spec, specPath);
137
162
  if (!resolved) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, { children: t("openapi.specNotFound", { specPath: specPath ?? t("openapi.specPathMissing") }) });
138
163
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("article", {
@@ -148,7 +173,7 @@ function OpenApiDocument(arg0) {
148
173
  }
149
174
  function OpenApiOperationWithSpec(arg0) {
150
175
  const { spec, path, method } = arg0;
151
- const t = require_shell.useBuiltInText();
176
+ const t = require_PageActions.useBuiltInText();
152
177
  const op = getOpenApiOperation(spec, path, method);
153
178
  if (!op) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, {
154
179
  tone: "red",
@@ -164,7 +189,7 @@ function OpenApiOperationWithSpec(arg0) {
164
189
  }
165
190
  function OpenApiOperation(arg0) {
166
191
  const { specPath, path, method } = arg0;
167
- const t = require_shell.useBuiltInText();
192
+ const t = require_PageActions.useBuiltInText();
168
193
  const spec = useOpenApiSpec(void 0, specPath);
169
194
  if (!spec) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WarningBox, { children: t("openapi.specNotFound", { specPath }) });
170
195
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OpenApiOperationWithSpec, {
@@ -219,10 +244,10 @@ exports.Button = require_OpenApiOperation.Button;
219
244
  exports.Callout = require_OpenApiOperation.Callout;
220
245
  exports.Card = require_OpenApiOperation.Card;
221
246
  exports.CardGroup = require_OpenApiOperation.CardGroup;
222
- exports.ClarifyConfigContext = require_shell.ClarifyConfigContext;
223
247
  exports.Code = require_OpenApiOperation.Code;
224
248
  exports.CodeGroup = require_OpenApiOperation.CodeGroup;
225
249
  exports.Collapse = require_OpenApiOperation.Collapse;
250
+ exports.ConfigContext = require_PageActions.ConfigContext;
226
251
  exports.DocShell = DocShell;
227
252
  exports.Feedback = require_OpenApiOperation.Feedback;
228
253
  exports.GridPattern = require_OpenApiOperation.GridPattern;
@@ -232,25 +257,28 @@ exports.Logo = require_OpenApiOperation.Logo;
232
257
  exports.Markdown = require_OpenApiOperation.Markdown;
233
258
  exports.OpenApiDocument = OpenApiDocument;
234
259
  exports.OpenApiOperation = OpenApiOperation;
235
- exports.OpenApisContext = require_shell.OpenApisContext;
260
+ exports.OpenApisContext = require_PageActions.OpenApisContext;
261
+ exports.PageBanner = require_ThemeRoot.PageBanner;
236
262
  exports.PageFooter = require_ThemeRoot.PageFooter;
237
263
  exports.Pre = require_OpenApiOperation.Pre;
238
264
  exports.Prose = require_OpenApiOperation.Prose;
239
- exports.SectionProvider = require_shell.SectionProvider;
265
+ exports.SectionProvider = require_PageActions.SectionProvider;
240
266
  exports.Tag = require_OpenApiOperation.Tag;
241
267
  exports.ThemeEditor = require_ThemeRoot.ThemeEditor;
242
- exports.ThemeProvider = require_shell.ThemeProvider;
243
- exports.ThemeToggle = require_shell.ThemeToggle;
268
+ exports.ThemeProvider = require_PageActions.ThemeProvider;
269
+ exports.ThemeToggle = require_PageActions.ThemeToggle;
244
270
  exports.WebFrame = require_OpenApiOperation.WebFrame;
245
- exports.applyClarifyThemeVariables = require_ThemeRoot.applyClarifyThemeVariables;
246
- exports.clarifyThemeEditorPresets = require_ThemeRoot.clarifyThemeEditorPresets;
271
+ exports.applyThemeVariables = require_ThemeRoot.applyThemeVariables;
247
272
  exports.markdownRemarkPlugins = require_remark.markdownRemarkPlugins;
248
- exports.remToPx = require_shell.remToPx;
273
+ exports.remToPx = require_PageActions.remToPx;
249
274
  exports.render = require_render.render;
250
- exports.useClarifyConfig = require_shell.useClarifyConfig;
275
+ exports.themeBootstrapScript = require_ThemeRoot.themeBootstrapScript;
276
+ exports.themeEditorPresets = require_ThemeRoot.themeEditorPresets;
277
+ exports.themePresets = require_ThemeRoot.themePresets;
278
+ exports.useConfig = require_PageActions.useConfig;
251
279
  exports.useMDXComponents = useMDXComponents;
252
- exports.useOpenApis = require_shell.useOpenApis;
253
- exports.useSectionStore = require_shell.useSectionStore;
254
- exports.useTheme = require_shell.useTheme;
280
+ exports.useOpenApis = require_PageActions.useOpenApis;
281
+ exports.useSectionStore = require_PageActions.useSectionStore;
282
+ exports.useTheme = require_PageActions.useTheme;
255
283
 
256
284
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useClarifyConfig, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useClarifyConfig()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec; tagFilter?: string[] }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n tagFilter?: string[]\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"mb-16\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400\">\n {t('openapi.openApiReference')}\n </p>\n <h1>{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n {spec.info?.description ? <Markdown className=\"lead *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"text-sm text-zinc-500 dark:text-zinc-400\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction operationMatchesTags(operationTags: string[] | undefined, filterTags: string[] | undefined): boolean {\n if (!filterTags?.length) return true\n return operationTags?.some(tag => filterTags.includes(tag)) ?? false\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec, tagFilter } = arg0\n\n const entries = listOpenApiOperations(spec)\n .filter(({ operation }) => operationMatchesTags(operation.tags, tagFilter))\n .map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath, tagFilter } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} tagFilter={tagFilter} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-(--clarify-theme-tokens-colors-background) px-6 py-10 text-(--clarify-theme-tokens-colors-foreground) md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-(--clarify-ui-text-soft)\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../source/openapi/lib/spec-path.ts","../source/openapi/lib/utils.ts","../source/openapi/entry.tsx","../source/mdx/components.ts","../source/mdx/DocShell.tsx"],"sourcesContent":["import { useLocation } from 'react-router-dom'\n\nimport { useConfig, useLocale, useOpenApis } from '../../core/context'\n\nimport type { OpenAPISpec } from './utils'\n\nconst VIRTUAL_PREFIX = 'virtual:clarify-page/'\n\nfunction resolveRelativePath(fromDir: string, to: string): string {\n const parts = (fromDir + '/' + to).split('/').filter(Boolean)\n const stack: string[] = []\n for (const part of parts) {\n if (part === '..') {\n stack.pop()\n } else if (part !== '.') {\n stack.push(part)\n }\n }\n return stack.join('/')\n}\n\nfunction normalizeSpecPath(specPath: string, currentRoutePath?: string, routePrefix = ''): string {\n if (specPath.startsWith(VIRTUAL_PREFIX)) return specPath\n\n const normalizedRoutePrefix = routePrefix.replace(/^\\/+|\\/+$/g, '')\n const normalizedSpecPath = specPath.startsWith('/') && normalizedRoutePrefix && specPath.slice(1).startsWith(`${normalizedRoutePrefix}/`)\n ? '/' + specPath.slice(normalizedRoutePrefix.length + 2)\n : specPath\n\n if (normalizedSpecPath.startsWith('/')) {\n return VIRTUAL_PREFIX + normalizedSpecPath.replace(/^\\//, '')\n }\n const fromDir = currentRoutePath === '/' ? '' : currentRoutePath?.replace(/^\\//, '').replace(/\\/[^/]*$/, '') ?? ''\n const normalizedFromDir = normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`)\n ? fromDir.slice(normalizedRoutePrefix.length + 1)\n : fromDir\n return VIRTUAL_PREFIX + resolveRelativePath(normalizedFromDir, normalizedSpecPath)\n}\n\n/**\n * 为绝对 specPath 生成带 locale 前缀的候选模块 ID。\n *\n * 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。\n * 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec\n * 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀\n * 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。\n */\nfunction localizeSpecModuleId(moduleId: string, specPath: string, locale: string | undefined, defaultLocale: string | undefined): string | undefined {\n if (!locale || locale === defaultLocale) return undefined\n // 仅处理绝对路径;相对路径已经基于含 locale 前缀的当前路由解析。\n if (!specPath.startsWith('/') || specPath.startsWith(VIRTUAL_PREFIX)) return undefined\n const rest = moduleId.slice(VIRTUAL_PREFIX.length)\n if (rest.startsWith(`${locale}/`) || rest === locale) return undefined\n return `${VIRTUAL_PREFIX}${locale}/${rest}`\n}\n\nexport function useOpenApiSpec(spec?: OpenAPISpec, specPath?: string): OpenAPISpec | null {\n const specs = useOpenApis()\n const location = useLocation()\n const config = useConfig()\n const locale = useLocale()\n\n if (spec) return spec\n if (!specPath) return null\n\n const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix)\n const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale)\n\n if (localized && specs[localized]) return specs[localized]\n return specs[normalized] ?? null\n}\n","import type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types'\n\nimport type { OpenApiRecord } from '../types'\n\nexport type OpenAPISpec = OpenAPIV3.Document | OpenAPIV3_1.Document\nexport type OpenAPIOperation = OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject\n\nexport const OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\nexport type OpenAPIHttpMethod = typeof OPENAPI_HTTP_METHODS[number]\n\nexport function isOpenAPIHttpMethod(method: string): method is OpenAPIHttpMethod {\n return (OPENAPI_HTTP_METHODS as readonly string[]).includes(method.toLowerCase())\n}\n\nfunction isRecord(value: unknown): value is OpenApiRecord {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction resolveOpenApiRef(spec: OpenAPISpec, ref: string): unknown {\n if (!ref.startsWith('#/')) return undefined\n\n return ref\n .slice(2)\n .split('/')\n .map((part) => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => (isRecord(current) ? current[part] : undefined), spec)\n}\n\nfunction getPathItem(spec: OpenAPISpec, path: string): OpenApiRecord | undefined {\n const pathItem = spec.paths?.[path]\n const resolved = isRecord(pathItem) && typeof pathItem.$ref === 'string' ? resolveOpenApiRef(spec, pathItem.$ref) : pathItem\n return isRecord(resolved) ? resolved : undefined\n}\n\nexport function getOpenApiOperation(spec: OpenAPISpec, path: string, method: string): OpenAPIOperation | undefined {\n if (!isOpenAPIHttpMethod(method)) return undefined\n return getPathItem(spec, path)?.[method.toLowerCase() as OpenAPIHttpMethod] as OpenAPIOperation | undefined\n}\n\nexport function listOpenApiOperations(spec: OpenAPISpec): Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> {\n const paths = spec.paths ?? {}\n const operations: Array<{ path: string; method: OpenAPIHttpMethod; operation: OpenAPIOperation }> = []\n\n for (const path of Object.keys(paths)) {\n const pathItem = getPathItem(spec, path)\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const operation = pathItem[method]\n if (operation) operations.push({ path, method, operation: operation as OpenAPIOperation })\n }\n }\n\n return operations\n}\n","import type { ReactNode } from 'react'\n\nimport { PageTitleActions } from '../app/PageActions'\nimport { Prose } from '../components/Prose'\nimport { useBuiltInText } from '../core/i18n'\nimport { Markdown } from '../mdx/Markdown'\n\nimport { OpenApiOperation as OpenApiOperationComponent } from './components/OpenApiOperation'\nimport { useOpenApiSpec } from './lib/spec-path'\nimport { getOpenApiOperation, listOpenApiOperations } from './lib/utils'\nimport type { OpenAPISpec } from './lib/utils'\n\ntype OpenApiPathsProps = { spec: OpenAPISpec; tagFilter?: string[] }\n\ntype OpenApiHeaderProps = { spec: OpenAPISpec }\n\ntype WarningBoxProps = {\n children: ReactNode\n tone?: 'amber' | 'red'\n}\n\nexport type OpenApiDocumentProps = {\n spec?: OpenAPISpec\n specPath?: string\n tagFilter?: string[]\n}\n\ntype OpenApiOperationWithSpecProps = {\n spec: OpenAPISpec\n path: string\n method: string\n}\n\nexport type OpenApiOperationProps = {\n specPath: string\n path: string\n method: string\n}\n\nfunction OpenApiHeader(arg0: OpenApiHeaderProps): ReactNode {\n const { spec } = arg0\n\n const t = useBuiltInText()\n return (\n <header className=\"clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8\">\n <p className=\"mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase\">\n {t('openapi.openApiReference')}\n </p>\n <div className=\"clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <h1 className=\"clarify-page-title min-w-0 flex-1\">{spec.info?.title ?? t('openapi.apiDocumentation')}</h1>\n <PageTitleActions />\n </div>\n {spec.info?.description ? <Markdown className=\"lead mt-4 *:first:mt-0 *:last:mb-0\">{spec.info.description}</Markdown> : null}\n {spec.info?.version ? <p className=\"mt-4 text-sm text-(--clarify-ui-text-faint)\">{t('openapi.version', { version: spec.info.version })}</p> : null}\n </header>\n )\n}\n\nfunction operationMatchesTags(operationTags: string[] | undefined, filterTags: string[] | undefined): boolean {\n if (!filterTags?.length) return true\n return operationTags?.some(tag => filterTags.includes(tag)) ?? false\n}\n\nfunction OpenApiPaths(arg0: OpenApiPathsProps): ReactNode {\n const { spec, tagFilter } = arg0\n\n const entries = listOpenApiOperations(spec)\n .filter(({ operation }) => operationMatchesTags(operation.tags, tagFilter))\n .map(({ path, method, operation }) => ({\n path,\n method: method.toUpperCase(),\n operation,\n }))\n\n return (\n <div className=\"clarify-api-endpoints divide-y divide-zinc-200/70 dark:divide-white/10\">\n {entries.map(({ path, method, operation }) => (\n <OpenApiOperationComponent key={`${method}-${path}`} spec={spec} path={path} method={method} operation={operation} />\n ))}\n </div>\n )\n}\n\nfunction WarningBox(arg0: WarningBoxProps): ReactNode {\n const { children, tone = 'amber' } = arg0\n\n const classes = tone === 'red'\n ? 'rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-200'\n : 'rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm text-amber-700 dark:border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200'\n\n return <div className={`clarify-warning ${classes}`}>{children}</div>\n}\n\nexport function OpenApiDocument(arg0: OpenApiDocumentProps): ReactNode {\n const { spec, specPath, tagFilter } = arg0\n const t = useBuiltInText()\n const resolved = useOpenApiSpec(spec, specPath)\n\n if (!resolved) {\n return <WarningBox>{t('openapi.specNotFound', { specPath: specPath ?? t('openapi.specPathMissing') })}</WarningBox>\n }\n\n return (\n <article className=\"clarify-openapi-page flex h-full flex-col pt-16 pb-10\">\n <Prose className=\"flex-auto\">\n <OpenApiHeader spec={resolved} />\n <OpenApiPaths spec={resolved} tagFilter={tagFilter} />\n </Prose>\n </article>\n )\n}\n\nfunction OpenApiOperationWithSpec(arg0: OpenApiOperationWithSpecProps): ReactNode {\n const { spec, path, method } = arg0\n const t = useBuiltInText()\n const op = getOpenApiOperation(spec, path, method)\n\n if (!op) {\n return <WarningBox tone=\"red\">{t('openapi.endpointNotFound', { endpoint: `${method.toUpperCase()} ${path}` })}</WarningBox>\n }\n\n const normalizedMethod = method.toUpperCase()\n return <OpenApiOperationComponent key={`${normalizedMethod}-${path}`} spec={spec} path={path} method={normalizedMethod} operation={op} />\n}\n\nexport function OpenApiOperation(arg0: OpenApiOperationProps): ReactNode {\n const { specPath, path, method } = arg0\n const t = useBuiltInText()\n const spec = useOpenApiSpec(undefined, specPath)\n\n if (!spec) {\n return <WarningBox>{t('openapi.specNotFound', { specPath })}</WarningBox>\n }\n\n return <OpenApiOperationWithSpec spec={spec} path={path} method={method} />\n}\n","import { Collapse } from '../components/Collapse'\nimport { OpenApiDocument, OpenApiOperation } from '../openapi'\n\nimport { Markdown } from './Markdown'\nimport * as mdxPrimitives from './primitives'\n\nconst builtInMDXComponents = {\n ...mdxPrimitives,\n Markdown,\n Collapse,\n}\n\nconst builtInOpenAPIComponents = {\n OpenApiDocument,\n OpenApiOperation,\n}\n\nexport function useMDXComponents(components: Record<string, unknown> = {}) {\n return {\n ...components,\n ...builtInMDXComponents,\n ...builtInOpenAPIComponents,\n }\n}\n","import type { ReactNode } from 'react'\n\nimport { Prose } from '../components/Prose'\n\nexport type DocShellProps = {\n title: string\n subtitle?: string\n children: ReactNode\n}\n\nexport function DocShell(arg0: DocShellProps) {\n const { title, subtitle, children } = arg0\n\n return (\n <main className=\"clarify-doc-shell min-h-screen bg-(--clarify-theme-tokens-colors-background) px-6 py-10 text-(--clarify-theme-tokens-colors-foreground) md:px-10\">\n <div className=\"mx-auto max-w-6xl\">\n <header className=\"mb-10\">\n <h1 className=\"text-3xl font-bold tracking-tight md:text-5xl\">{title}</h1>\n {subtitle ? <p className=\"mt-3 max-w-2xl text-(--clarify-ui-text-soft)\">{subtitle}</p> : null}\n </header>\n <Prose>{children}</Prose>\n </div>\n </main>\n )\n}\n"],"mappings":"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"}
package/output/index.d.ts CHANGED
@@ -1,24 +1,26 @@
1
1
  import { AppShell } from './app/AppShell';
2
2
  import { BuiltWithClarify } from './app/BuiltWithClarify';
3
+ import { PageBanner } from './app/PageBanner';
3
4
  import { PageFooter } from './app/PageFooter';
4
5
  import { SectionProvider, useSectionStore, Section } from './app/SectionProvider';
5
6
  import { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Feedback, GridPattern, Heading, HeroPattern, Logo, Pre, Prose, Tag, WebFrame } from './components';
6
- import { ClarifyConfigContext, OpenApisContext, useClarifyConfig, useOpenApis } from './context';
7
+ import { ConfigContext, OpenApisContext, useConfig, useOpenApis } from './context';
7
8
  import { useMDXComponents } from './mdx/components';
8
9
  import { DocShell } from './mdx/DocShell';
9
10
  import { Markdown } from './mdx/Markdown';
10
11
  import { markdownRemarkPlugins } from './mdx/remark';
11
12
  import { OpenApiDocument, OpenApiOperation } from './openapi';
12
13
  import { render } from './runtime/render';
13
- import { applyClarifyThemeVariables, clarifyThemeEditorPresets, ThemeEditor } from './theme/ThemeEditor';
14
+ import { applyThemeVariables, themeEditorPresets, ThemeEditor } from './theme/ThemeEditor';
14
15
  import { ThemeProvider, useTheme } from './theme/ThemeProvider';
15
16
  import { ThemeToggle } from './theme/ThemeToggle';
16
- import { ClarifyConfig, RouteItem, RenderOptions, ServerRenderOptions } from './types';
17
+ import { themePresets, themeBootstrapScript } from './theme/variables';
18
+ import { Config, RouteItem, RenderOptions, ServerRenderOptions } from './types';
17
19
  import { remToPx } from './utils/remToPx';
18
20
  export type { OpenApiOperationProps, OpenApiDocumentProps, OpenAPIOperation, OpenAPISpec } from './openapi';
19
21
  export type { ThemeEditorProps } from './theme/ThemeEditor';
20
- export type { ClarifyConfig, RouteItem, RenderOptions, ServerRenderOptions, Section };
21
- export { AppShell, render, ClarifyConfigContext, OpenApisContext, useClarifyConfig, useOpenApis, BuiltWithClarify, PageFooter, ThemeProvider, ThemeToggle, ThemeEditor, useTheme, SectionProvider, useSectionStore, remToPx, applyClarifyThemeVariables, clarifyThemeEditorPresets };
22
+ export type { Config, RouteItem, RenderOptions, ServerRenderOptions, Section };
23
+ export { AppShell, render, ConfigContext, OpenApisContext, useConfig, useOpenApis, BuiltWithClarify, PageBanner, PageFooter, ThemeProvider, ThemeToggle, ThemeEditor, useTheme, SectionProvider, useSectionStore, remToPx, applyThemeVariables, themeEditorPresets, themePresets, themeBootstrapScript };
22
24
  export { Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, Pre, Prose, Heading, Logo, GridPattern, HeroPattern, Feedback, Tag, WebFrame };
23
25
  export { DocShell, Markdown, useMDXComponents, markdownRemarkPlugins };
24
26
  export { OpenApiDocument, OpenApiOperation };
package/output/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { C as Code, D as CardGroup, E as Card, O as Callout, S as Collapse, T as Pre, _ as HeroPattern, b as Tag, f as Markdown, g as GridPattern, h as Prose, k as Button, m as WebFrame, n as OpenApiOperation$1, p as primitives_exports, v as Logo, w as CodeGroup, x as Feedback, y as Heading } from "./OpenApiOperation-CWSOhUVa.js";
2
- import { A as OpenApisContext, D as useBuiltInText, N as useOpenApis, O as ClarifyConfigContext, a as useSectionStore, d as ThemeToggle, f as ThemeProvider, i as SectionProvider, j as useClarifyConfig, o as remToPx, p as useTheme } from "./shell-CumiARRe.js";
3
- import { a as AppShell, i as clarifyThemeEditorPresets, n as ThemeEditor, o as PageFooter, r as applyClarifyThemeVariables, s as BuiltWithClarify } from "./ThemeRoot-C_ZdzSMu.js";
1
+ import { C as Code, D as CardGroup, E as Card, O as Callout, S as Collapse, T as Pre, _ as HeroPattern, b as Tag, f as Markdown, g as GridPattern, h as Prose, k as Button, m as WebFrame, n as OpenApiOperation$1, p as primitives_exports, v as Logo, w as CodeGroup, x as Feedback, y as Heading } from "./OpenApiOperation-tUKf7lZ4.js";
2
+ import { A as OpenApisContext, D as useBuiltInText, M as useLocale, N as useOpenApis, O as ConfigContext, c as remToPx, h as useTheme, j as useConfig, m as ThemeProvider, n as PageTitleActions, o as SectionProvider, p as ThemeToggle, s as useSectionStore } from "./PageActions-yoDRjkq8.js";
3
+ import { a as themeBootstrapScript, c as AppShell, d as PageBanner, i as themeEditorPresets, l as PageFooter, n as ThemeEditor, o as themePresets, r as applyThemeVariables, u as BuiltWithClarify } from "./ThemeRoot-QULrwQf6.js";
4
4
  import { t as markdownRemarkPlugins } from "./remark-Dd2WU50s.js";
5
- import { t as render } from "./render-CnUd0XwZ.js";
5
+ import { t as render } from "./render-psutGbsg.js";
6
6
  import { useLocation } from "react-router-dom";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region source/openapi/lib/spec-path.ts
@@ -22,13 +22,32 @@ function normalizeSpecPath(specPath, currentRoutePath, routePrefix = "") {
22
22
  const fromDir = currentRoutePath === "/" ? "" : currentRoutePath?.replace(/^\//, "").replace(/\/[^/]*$/, "") ?? "";
23
23
  return VIRTUAL_PREFIX + resolveRelativePath(normalizedRoutePrefix && fromDir.startsWith(`${normalizedRoutePrefix}/`) ? fromDir.slice(normalizedRoutePrefix.length + 1) : fromDir, normalizedSpecPath);
24
24
  }
25
+ /**
26
+ * 为绝对 specPath 生成带 locale 前缀的候选模块 ID。
27
+ *
28
+ * 局部嵌入(OpenApiOperation / OpenApiDocument)通常使用 `/api` 这样的绝对路径。
29
+ * 默认 locale 的 spec 注册在 `virtual:clarify-page/api`,而其他 locale 的 spec
30
+ * 注册在 `virtual:clarify-page/<locale>/api`。相对路径会因为当前路由已含 locale 前缀
31
+ * 而自动解析到正确的 spec,但绝对路径不会,因此这里显式注入 locale 前缀。
32
+ */
33
+ function localizeSpecModuleId(moduleId, specPath, locale, defaultLocale) {
34
+ if (!locale || locale === defaultLocale) return void 0;
35
+ if (!specPath.startsWith("/") || specPath.startsWith(VIRTUAL_PREFIX)) return void 0;
36
+ const rest = moduleId.slice(21);
37
+ if (rest.startsWith(`${locale}/`) || rest === locale) return void 0;
38
+ return `${VIRTUAL_PREFIX}${locale}/${rest}`;
39
+ }
25
40
  function useOpenApiSpec(spec, specPath) {
26
41
  const specs = useOpenApis();
27
42
  const location = useLocation();
28
- const config = useClarifyConfig();
43
+ const config = useConfig();
44
+ const locale = useLocale();
29
45
  if (spec) return spec;
30
46
  if (!specPath) return null;
31
- return specs[normalizeSpecPath(specPath, location.pathname, config.routePrefix)] ?? null;
47
+ const normalized = normalizeSpecPath(specPath, location.pathname, config.routePrefix);
48
+ const localized = localizeSpecModuleId(normalized, specPath, locale, config.i18n?.defaultLocale);
49
+ if (localized && specs[localized]) return specs[localized];
50
+ return specs[normalized] ?? null;
32
51
  }
33
52
  //#endregion
34
53
  //#region source/openapi/lib/utils.ts
@@ -84,19 +103,25 @@ function OpenApiHeader(arg0) {
84
103
  const { spec } = arg0;
85
104
  const t = useBuiltInText();
86
105
  return /* @__PURE__ */ jsxs("header", {
87
- className: "mb-16",
106
+ className: "clarify-openapi-header mb-16 border-b border-(--clarify-theme-tokens-colors-border) pb-8",
88
107
  children: [
89
108
  /* @__PURE__ */ jsx("p", {
90
- className: "mb-3 text-xs/6 font-medium tracking-widest text-emerald-500 uppercase dark:text-emerald-400",
109
+ className: "mb-3 text-xs/6 font-medium tracking-widest text-(--clarify-ui-accent-text) uppercase",
91
110
  children: t("openapi.openApiReference")
92
111
  }),
93
- /* @__PURE__ */ jsx("h1", { children: spec.info?.title ?? t("openapi.apiDocumentation") }),
112
+ /* @__PURE__ */ jsxs("div", {
113
+ className: "clarify-page-title-row flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
114
+ children: [/* @__PURE__ */ jsx("h1", {
115
+ className: "clarify-page-title min-w-0 flex-1",
116
+ children: spec.info?.title ?? t("openapi.apiDocumentation")
117
+ }), /* @__PURE__ */ jsx(PageTitleActions, {})]
118
+ }),
94
119
  spec.info?.description ? /* @__PURE__ */ jsx(Markdown, {
95
- className: "lead *:first:mt-0 *:last:mb-0",
120
+ className: "lead mt-4 *:first:mt-0 *:last:mb-0",
96
121
  children: spec.info.description
97
122
  }) : null,
98
123
  spec.info?.version ? /* @__PURE__ */ jsx("p", {
99
- className: "text-sm text-zinc-500 dark:text-zinc-400",
124
+ className: "mt-4 text-sm text-(--clarify-ui-text-faint)",
100
125
  children: t("openapi.version", { version: spec.info.version })
101
126
  }) : null
102
127
  ]
@@ -212,6 +237,6 @@ function DocShell(arg0) {
212
237
  });
213
238
  }
214
239
  //#endregion
215
- export { AppShell, BuiltWithClarify, Button, Callout, Card, CardGroup, ClarifyConfigContext, Code, CodeGroup, Collapse, DocShell, Feedback, GridPattern, Heading, HeroPattern, Logo, Markdown, OpenApiDocument, OpenApiOperation, OpenApisContext, PageFooter, Pre, Prose, SectionProvider, Tag, ThemeEditor, ThemeProvider, ThemeToggle, WebFrame, applyClarifyThemeVariables, clarifyThemeEditorPresets, markdownRemarkPlugins, remToPx, render, useClarifyConfig, useMDXComponents, useOpenApis, useSectionStore, useTheme };
240
+ export { AppShell, BuiltWithClarify, Button, Callout, Card, CardGroup, Code, CodeGroup, Collapse, ConfigContext, DocShell, Feedback, GridPattern, Heading, HeroPattern, Logo, Markdown, OpenApiDocument, OpenApiOperation, OpenApisContext, PageBanner, PageFooter, Pre, Prose, SectionProvider, Tag, ThemeEditor, ThemeProvider, ThemeToggle, WebFrame, applyThemeVariables, markdownRemarkPlugins, remToPx, render, themeBootstrapScript, themeEditorPresets, themePresets, useConfig, useMDXComponents, useOpenApis, useSectionStore, useTheme };
216
241
 
217
242
  //# sourceMappingURL=index.js.map